0

我有 2 张桌子

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

Tones [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

非常感谢您的帮助,

安迪

4

1 回答 1

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 BYandORDER BY子句之间创建的错误语义。只有 MySQL 会接受您的原始查询。这里有一些见解:

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

于 2012-07-12T15:11:37.163 回答