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

时间:2018-05-03 05:05:27

标签: mysql join sql-order-by

以下是我的用户案例:

有些代理商可以拥有一个或多个地点。 他们可以为每个位置和排名购买订阅(排名是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 个答案:

答案 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]”。它只返回此位置的排名,并避免重复记录,因为每个位置只有一个排名。