我有一个表,我希望能够根据另一个相关表中数据的存在进行排序,但我不确定在单个查询中我想做什么。
例如,假设我有一个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
语句中管理它。我可以轻松地提取那些已经或者没有某种类型的有效通知的产品,但是我无法找到一种方法来同时获取它们并根据它进行排序。是可能还是我只需要运行几个单独的查询?
答案 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
列表中的计数。