2014-02-19 132 views
0

我試圖根據給定的值合併另一個表上的一個表。但是,它並不像JOIN那麼簡單。 (我在網上發現了很多JOIN示例,但沒有一個是這樣的,而且,我在DB查詢方面的表現並不令人難以置信。)MySQL基於表B行中的值將表B合併到表A中

有關我想要完成的一個簡單示例,可以說我運行電腦商店,向多個人出售多臺電腦。無論出於何種原因,這些機器都會定期與我聯繫,並且我想知道我的哪些客戶有一臺當前處於脫機狀態的機器。但是,如果他們至少有一臺機器在線,我不希望看到他們擁有的任何在線或離線機器。

我的查詢到目前爲止是這樣的:

SELECT * 
FROM Computers 
LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
WHERE Computers.Currently_Online LIKE "0" 

但是,如果一個客戶有2臺電腦,每一個狀態,它會顯示一臺電腦,當我想讓它顯示兩者都不是。 (因爲一個人目前處於離線狀態,所以我不在乎在線的人。)我怎麼能解決這個問題?

這裏是我的數據庫的粗略視覺近似:

Customers: 
ID  Other Stuff 


Computers_On_Customers 
ID  Customer_ID  Computer_ID 

Computers: 
ID  Currently_Online 

任何幫助將不勝感激。

+0

仍在掙扎?考慮提供適當的DDL(和/或一個sqlfiddle)與期望的結果集合 – Strawberry

+0

感謝您的幫助傢伙!所有3個查詢都很有趣,並且讓我看起來很棒。我不確定哪一個答案是「一個真正的答案」,但我會在有一個答案時更新。再次感謝! – Dwebtron

回答

1

您需要執行聚集,然後採取聚集的結果,你想要的過濾器中進行選擇。

使用你的例子。把它移到聚合選擇之外。

SELECT 
    ID, offline_count 
from 
    (SELECT 
     Customers.ID, 
      SUM(IF(Computers.Currently_Online Like '0', 0, 1)) 'offline_count' 
    FROM 
     Computers 
    LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
    LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
    GROUP BY Customers.ID) c 
where 
    c.offline_count > 0 

假設data_table有信息來指定用戶是在線還是離線,並且可以有多個條目。合計用戶並完成離線計數的總和,如果聚合後> 0,則知道該用戶有離線輸入。您可以使用HAVING子句實現類似。

+0

所有3個答案都很棒,但是這個答案真的讓我走上了正確的道路,我需要成爲什麼樣的人。再次感謝你們! – Dwebtron

1

你可以使用NOT EXISTS過濾掉電腦的擁有者擁有一臺計算機在線:

SELECT * FROM Computers 
    LEFT JOIN Computers_On_Customers ON Computer_ID = Computers.ID 
    LEFT JOIN Customers ON Computers_On_Customers.Customer_ID = Customers.ID 
WHERE 
    Computers.Currently_Online LIKE "0" AND 
    NOT EXISTS (
       SELECT 1 FROM Computers_On_Customers 
        LEFT JOIN Computers ON Computer_ID = Computers.ID 
        WHERE 
         Currently_Online LIKE "1" AND 
         Computers_On_Customers.Customer_ID = Customers.ID 
       ) 
1

假設你只是想客戶數據 - 當然你可以滾了整個事情了一個GROUP BY條款......既然你只記錄,你應該能夠使用的Computers.Currently_Online = 0最大值之後一個MAX功能,以排除任何地方該值> 0

SELECT Customers.*, MAX(Computers.Currently_Online) AS computer_online 
FROM Customers 

INNER JOIN Computers_On_Customers 
    ON Customers.ID = Computers_On_Customers.Customer_ID 

INNER JOIN Computers 
    ON Computers_On_Customers.Computer_ID = Computers.ID 

GROUP BY Customers.ID 

HAVING computer_online = 0 

我個人不喜歡嵌套的SELECT,除非我絕對要...在這些情況下,我寧願把它變成一個存儲過程。

相關問題