以下是我的用户案例:
有些代理商可以拥有一个或多个地点。 他们可以为每个位置和排名购买订阅(排名是1到5之间的整数)。因此,代理商可以拥有多个订阅(每个位置最多一个)
以下是表格:
agency: id, name
location: id, name
agency_location: agency_id, location_id
subscription: id, agency_id, location_id, ranking
到目前为止,这么好,非常简单。
然后我想显示给定位置的所有代理商(比如,location_id = 9),并通过对此位置的排名来排序(知道某些代理商不会有订阅 - 即没有排名,应该来在有订阅的人之后。)
我尝试了各种各样的SQL语句,但似乎无法弄明白......
例如:
SELECT * FROM {agencies}
LEFT JOIN subscription ON subscription.agency_id=agency.id
ORDER BY (subscription.ranking IS NULL) ASC, subscription ranking ASC
将返回所有代理商,其中包含按其排名排序的订阅者。
但是, 1)如果代理商有多个订阅,它会返回重复值 2)它没有考虑位置
非常感谢任何线索,非常感谢你!
答案 0 :(得分:0)
SELECT * FROM agencies a
LEFT JOIN subscriptions s ON s.agency_id = a.id
WHERE s.location_id = 9 ORDER BY s.ranking ASC
此查询将为您提供按某个位置排序的ranking
代理商列表= 9.没有订阅的代理商将在下方,因为他们的排名将为NULL
。但是,当代理商有多个订阅时,此查询的结果可能包含重复项。
你必须对结果做group by
,比如
SELECT * FROM (
SELECT * FROM agencies a
LEFT JOIN subscriptions s ON s.agency_id = a.id
WHERE s.location_id = 9 ORDER BY s.ranking ASC
) as tempTable GROUP BY a.id
或者您可以将结果再次作为tempTable和left join
代理商表格,然后group by
。亲自尝试一下,我希望你有主意。祝你好运!
答案 1 :(得分:0)
SELECT a.* FROM agencies a
LEFT JOIN subscription s ON s.agency_id=a.id AND s.location_id=[some_id]
ORDER BY (s.ranking IS NULL) ASC, s.ranking ASC
关键是在LEFT JOIN语句中添加“AND s.location_id = [some_id]”。它只返回此位置的排名,并避免重复记录,因为每个位置只有一个排名。