mysql:基于另一个不总是有匹配值的连接表进行排序

elcex8rz  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(317)

以下是我的用户案例:
有些机构可以有一个或多个地点。他们可以为每个位置和排名购买订阅(排名是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)它不考虑位置
任何线索都将不胜感激,非常感谢!

lhcgjxsq

lhcgjxsq1#

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

或者你可以让结果变得诱人 left join 一次又一次的 group by . 你自己试试吧,我希望你知道主要的意思。祝你好运!

f5emj3cl

f5emj3cl2#

啊,找到了解决办法:

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

关键是在左join语句中添加“and s.location\u id=[some\u id]”。它既只返回此位置的排名,又避免重复记录,因为每个位置只有一个排名。

相关问题