带有JOINS的MySQL GROUP BY和SORT BY

时间:2011-01-05 23:32:44

标签: mysql join group-by sql-order-by

我有3张桌子:

  1. items(item_id,timestamp)
  2. items_terms(item_id,term_id)
  3. terms(term_id,term_name)
  4. 我需要根据项目时间戳找到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 :(得分:2)

如何在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

答案 1 :(得分:0)

我建议阅读this文章,因为在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

答案 2 :(得分: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