Mysql 带where和having count()条件的SQL连接
我有两张桌子 睡眠会话[id,用户id,(一些其他值)] 音调[id,sleep\u sessions.id(FK),(一些其他值)] 我需要选择10个sleep_会话,其中user_id=55,并且每个sleep_会话记录至少有2个与之关联的音调记录 我目前有以下几点: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`
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