SQL连接with where和having count()条件

时间:2012-07-12 15:03:35

标签: mysql sql join where having

我有2张桌子

Sleep_sessions [id,user_id,(其他一些值)]

音调 [id,sleep_sessions.id(FK),(其他一些值)]

我需要选择10个sleep_sessions,其中user_id = 55,并且每个sleep_session记录至少有2个与之关联的音调记录。

我目前有以下内容;

SELECT `sleep_sessions`.*
FROM (`sleep_sessions`)
JOIN `tones` ON sleep_sessions.id = `tones`.`sleep_session_id`
WHERE `user_id` = 55
GROUP BY `sleep_sessions`.`id`
HAVING count(tones.id) > 4
ORDER BY `started` desc
LIMIT 10

但是我注意到count(tone.id)基本上是整个音调表而不是当前正在加入的sleep_session

非常感谢你的帮助,

安迪

1 个答案:

答案 0 :(得分:1)

我不确定您的查询出了什么问题。也许,试试

HAVING count(*)

以下查询可能更具可读性(理解起来可能有点麻烦):

SELECT *
FROM (`sleep_sessions`)
WHERE `user_id` = 55
AND (SELECT count(*) FROM `tones` 
     WHERE `sleep_sessions`.`id` = `tones`.`sleep_session_id`) > 4
ORDER BY `started` desc
LIMIT 10

这样做的好处是,您不会弄乱您在GROUP BYORDER BY子句之间创建的错误语义。只有MySQL会接受您的原始查询。以下是一些见解:

http://dev.mysql.com/doc/refman/5.6/en/group-by-hidden-columns.html