我正在构建一个系统,我需要能够根据多对多关系过滤搜索结果。
我有一个users
表,一个bands
和一个联接表band_user
我需要选择users
,他们最喜欢的乐队都没有巡演或录音。我在乐队表status
上有一个字段,我正在过滤它。
SELECT `u`.*, COUNT(`b`.`id`) as `band_count` FROM `users` `u`
LEFT JOIN `band_users` `bu` on bu`.`user_id` = `u`.`id`
LEFT JOIN `bands` `b` on `bu`.`band_id` = `b`.`id`
WHERE `b`.`status` = "touring"
GROUP_BY `u`.`id`
HAVING `band_count` > 0
此查询为我提供了一个列表,其中列出了至少有一个喜爱的乐队设置为巡回演出的所有用户(或者如果您更改状态参数则录制)。
我要做的是选择那些拥有所有自己喜欢的乐队并且空闲的用户的用户。状态。
我还需要优先考虑至少有一个乐队正在巡回演出的用户,因此如果用户有一个正在录制的喜欢乐队,并且喜欢正在巡回演出的乐队,那么用户的总体状态是&# 39;记录'
答案 0 :(得分:1)
您可能只想选择喜欢的乐队不巡回演出或录制的用户。
SELECT `u`.*, COUNT(`b`.`id`) as `band_count` FROM `users` `u`
LEFT JOIN `band_users` `bu` on bu`.`user_id` = `u`.`id`
LEFT JOIN `bands` `b` on `bu`.`band_id` = `b`.`id`
WHERE `u`.`id` NOT IN (SELECT `u`.`id`
FROM `users` `u`
LEFT JOIN `band_users` `bu` on bu`.`user_id` = `u`.`id`
LEFT JOIN `bands` `b` on `bu`.`band_id` = `b`.`id`
WHERE `b`.`status` = "touring" OR `b`.`status` = "recording")
GROUP_BY `u`.`id`
<强>解释强>
以下查询用于选择至少拥有收藏夹的用户 乐队巡演或录音。
SELECT `u`.`id`
FROM `users` `u`
LEFT JOIN `band_users` `bu` on bu`.`user_id` = `u`.`id`
LEFT JOIN `bands` `b` on `bu`.`band_id` = `b`.`id`
WHERE `b`.`status` = "touring" OR `b`.`status` = "recording"
由于在此查询中删除了所有巡回乐队和录制乐队,因此我没有完全了解您想要为录制乐队制作的'优先级'。