Mysql 带where和having count()条件的SQL连接

Mysql 带where和having count()条件的SQL连接,mysql,sql,join,where,having,Mysql,Sql,Join,Where,Having,我有两张桌子 睡眠会话[id,用户id,(一些其他值)] 音调[id,sleep\u sessions.id(FK),(一些其他值)] 我需要选择10个sleep_会话,其中user_id=55,并且每个sleep_会话记录至少有2个与之关联的音调记录 我目前有以下几点: SELECT `sleep_sessions`.* FROM (`sleep_sessions`) JOIN `tones` ON sleep_sessions.id = `tones`.`sleep_session_id`

我有两张桌子

睡眠会话[id,用户id,(一些其他值)]

音调[id,sleep\u sessions.id(FK),(一些其他值)]

我需要选择10个sleep_会话,其中user_id=55,并且每个sleep_会话记录至少有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)基本上是整个tones表,而不是当前加入的sleep\u会话

非常感谢你的帮助


安迪:我不知道你的问题出在哪里了。也许,试试看

HAVING count(*)
下面的查询可能更具可读性(可能有点难以理解):

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


非常感谢,先生:)我能问一下,我在选择select或数据库设置时是否做错了什么?或者这是一个可以接受的查询?@Garbit:我会小心使用MySQL中的
groupby
。它是唯一一个允许这种非法的
groupby
SQL语法的数据库。这将打开潘多拉的盒子,特别是当与
HAVING
orderby
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