2014-10-18 101 views
0

我有一張表,我希望能夠根據另一個相關表中的數據的存在進行排序,但我不確定我想在單個查詢中執行什麼操作。MySQL - 是否可以根據另一個表中的數據來排序來自一個表的數據?

例如,假設我有一個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 

一種用途情況下,我想是支持從Products表基於是否存在針對該產品的特定類型(Type = 1)的活動的通知的數據進行排序。因此,在上面的例子中,產品3和5要首先或最後整理,但所有五種產品仍應在結果集中。

我一直無法找到一種方法來在單個SELECT聲明中進行管理。我可以輕鬆地拉取只有或沒有特定類型主動通知的產品,但我無法找到一種方法來一次獲得所有這些通知,並基於此進行分類。這是可能的還是我只需要運行幾個單獨的查詢?

回答

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計數名單。

+0

謝謝!那很完美!我甚至沒有想過嘗試使用子查詢作爲'JOIN'的一半,但是這可以讓我完成我所需要的。 – MaineChap 2014-10-18 23:31:21

相關問題