MySQL - 是否可以根据另一个表中数据的存在对一个表中的数据进行排序?

时间:2014-10-18 23:12:29

标签: mysql select

我有一个表,我希望能够根据另一个相关表中数据的存在进行排序,但我不确定在单个查询中我想做什么。

例如,假设我有一个Products表和一个Notifications表。每个表都有一堆列,但为此目的的重要列是Active列,以及Notifications表中引用Products表的外键。 Products表中的每一行可在Notifications表中引用0到N次。

Products              Notifications
ProductID | Active    NotificationID | ProductID | Active | Type
----------+-------    ---------------+-----------+--------+-----
1         | 1         1              | 2         | 1      | 2
2         | 1         2              | 3         | 0      | 1
3         | 1         3              | 3         | 1      | 1
4         | 1         4              | 5         | 1      | 1
5         | 1         5              | 3         | 1      | 1

我想支持的一个用例是根据产品是否存在特定类型(Type = 1)的活动通知对Products表中的数据进行排序。因此,在上面的示例中,产品3和5将首先进行整理或最后整理,但所有五个产品仍应位于结果集中。

我还没有找到一种方法来在一个SELECT语句中管理它。我可以轻松地提取那些已经或者没有某种类型的有效通知的产品,但是我无法找到一种方法来同时获取它们并根据它进行排序。是可能还是我只需要运行几个单独的查询?

1 个答案:

答案 0 :(得分:0)

您想要的是通过join和聚合完成的。我建议将通知表总结为子查询以获得您想要的内容:

select p.*
from products p left join
     (select productId, count(*) as cnt
      from notifications n
      where active = 1
      group by productid
     ) n
     on p.productid = n.productid
order by (n.productid is not null) desc;

此结构使您可以灵活地使用存在(如上所示),或计数,或包括select列表中的计数。