我有3张桌子:
我需要根据项目时间戳找到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方面,但此查询需要在连续页面上支持分页而不重复。
很高兴看到任何建议。
答案 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