首页 文章

带有JOINS的MySQL GROUP BY和SORT BY

提问于
浏览
1

我有3张 table :

  • 项(item_id,时间戳)

  • items_terms(item_id,term_id)

  • 个术语(term_id,term_name)

我需要根据项目时间戳找到5个最近的术语(term_id,term_name) . 我试图像这样解决它:

SELECT t.term_id, t.term_name
 FROM items i
  INNER JOIN items_terms it USING(item_id)
  INNER JOIN terms t USING (term_id)
GROUP BY t.term_id 
ORDER BY i.timestamp DESC
LIMIT 5

但问题是MySQL会首先对项目进行分组(它将占用第一个term_id)并忽略ORDER BY ..

我还考虑通过删除GROUP BY并选择5个以上的项来过滤PHP,但是这个查询需要在连续页面上支持分页而不重复 .

很高兴看到任何建议 .

3 回答

  • 0
    SELECT DISTINCT term_id, 
     DISTINCT term_name
     FROM(select t.term_id, t.term_name,i.timestamp FROM items i INNER JOIN items_terms it
     on i.item_id=it.item_id 
     INNER JOIN terms t
     on it.term_id=t.term_id
     GROUP BY t.term_id 
     )
     ORDER BY i.timestamp DESC
     LIMIT 5
    
  • 0

    如何在select语句中包含时间戳:

    SELECT t.term_id, t.term_name, MAX(i.timestamp)
     FROM items i
      INNER JOIN items_terms it USING(item_id)
      INNER JOIN terms t USING (term_id)
    GROUP BY t.term_id, t.term_name
    ORDER BY MAX(i.timestamp) DESC
    LIMIT 5
    
  • 2

    我建议阅读本文,因为在MySQL中有几种技术可以限制GROUP BY选择组中的行,很少有可能适合您的需要 . 通常使用带有查询“全局”变量的HAVING指令应该是首选的,因为它对已经分组的结果集进行操作,这会对性能产生积极影响 .

    编辑:解决方案将是:

    SELECT DISTINCT
      t.term_id,
      t.term_name
    FROM
      items i
    INNER JOIN items_terms it USING(item_id)
    INNER JOIN terms t USING (term_id)
    ORDER BY
      i.timestamp DESC
    LIMIT 5
    

相关问题