以下是我的用户案例:
有些机构可以有一个或多个地点。他们可以为每个位置和排名购买订阅(排名是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)它不考虑位置
任何线索都将不胜感激,非常感谢!
2条答案
按热度按时间lhcgjxsq1#
此查询将为您提供排序依据
ranking
某些位置的代理列表=9。没有订阅的机构将排名靠后,因为它们的排名将是NULL
. 但当代理有多个订阅时,此查询的结果可能包含重复项。你必须这么做
group by
过了结果,就像或者你可以让结果变得诱人
left join
一次又一次的group by
. 你自己试试吧,我希望你知道主要的意思。祝你好运!f5emj3cl2#
啊,找到了解决办法:
关键是在左join语句中添加“and s.location\u id=[some\u id]”。它既只返回此位置的排名,又避免重复记录,因为每个位置只有一个排名。