2012-04-20 99 views
0

這個問題對我來說有點困難,但我想我已經想出了一個可以實現這個想法的例子。將兩張桌子組合在一起,以便一張桌子上的所有行都與另一張桌子上的每一行相匹配

我有三個表bird_brd,state_stt和bird_in_state_bis

前兩個表格只是列表和第三個表是加入其他兩個togther的方式,並具有計數領域的次鳥的數量已經在一個州被看到。

我不認爲表的結構都不算什麼,但這裏有基本

bird_brd 
===================== 
| id_brd | name_brd | 
===================== 
| 1 | Blue Jay | 
| 2 | Robbin | 
===================== 

state_stt 
===================== 
| id_stt | name_stt | 
===================== 
| 1 | Utah | 
| 2 | Arizona | 
| 3 | Wyoming | 
===================== 

bird_in_state_bis 
======================================= 
| stt_id_bis | brd_id_bis | count_bis | 
======================================= 
|  1  |  1  |  5  | 
|  2  |  2  |  3  | 
======================================= 

我希望能夠做的是結合這些表,以便在出現在一個條目bird_in_state表的狀態,它將顯示所有鳥類的數量,無論它們是否在bird_in_state表中。

所以當我運行查詢我希望像下面

================================== 
| State Name | Bird Name | Count | 
================================== 
| Utah | Blue Jay | 5 | 
| Utah | Robbin | 0 | 
| Arizona | Blue Jay | 0 | 
| Arizona | Robbin | 3 | 
================================== 

注意結果,這是我正在努力的工作要做,上面的表格是不是我工作的實際表但是他們是我必須與之合作的一個很好的例子。

我試圖使用某種左或右連接,但我沒有得到我在找什麼。

在此先感謝您的幫助。

+0

查找'union'關鍵字 – asawyer 2012-04-20 15:40:36

+0

@asawyer我看着它,我無法弄清楚如何使用它得到的結果,我尋找。如果您可以給出一個很好的示例查詢。謝謝 – 2012-04-20 16:09:29

回答

0

我認爲這是你要找的。

SELECT 
    Bird.Name, 
    State.Name, 
    IFNULL(BirdsInState.Count, 0) AS Count 
FROM (SELECT State AS StateID,ID AS BirdID FROM (SELECT DISTINCT(State) AS State FROM BirdsInState) AS UniqStates, Bird) BirdStates 
LEFT JOIN Bird ON BirdStates.BirdID = Bird.ID 
LEFT JOIN State ON BirdStates.StateID = State.ID 
LEFT JOIN BirdsInState ON BirdID = BirdsInState.Bird 
    AND StateID = BirdsInState.State; 

它首先做笛卡爾跨所有使用的狀態和所有可用的鳥加入所有可能的組合。然後它回到原來的三張表格中,以獲得鳥類,州和計數的名稱。在這樣的連接中,如果計數不可用,計數將爲空,因此我們使用IFNULL函數將所有零點轉換爲0。

當我使用這些表:

mysql> SHOW CREATE TABLE State; 
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                         | 
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| State | CREATE TABLE `State` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(63) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1 | 
+-------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SHOW CREATE TABLE Bird; 
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table | Create Table                                         | 
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Bird | CREATE TABLE `Bird` (
    `ID` int(11) NOT NULL AUTO_INCREMENT, 
    `Name` varchar(63) DEFAULT NULL, 
    PRIMARY KEY (`ID`) 
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=latin1 | 
+-------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SHOW CREATE TABLE BirdsInState; 
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| Table  | Create Table                                                        | 
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
| BirdsInState | CREATE TABLE `BirdsInState` (
    `Bird` int(11) NOT NULL DEFAULT '0', 
    `State` int(11) NOT NULL DEFAULT '0', 
    `Count` int(11) DEFAULT NULL, 
    PRIMARY KEY (`Bird`,`State`), 
    KEY `State` (`State`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 | 
+--------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ 
1 row in set (0.00 sec) 
+0

哇,它真的很複雜,但爲我工作。現在我只需將其翻譯成我的實際表格。謝謝。 – 2012-04-20 17:36:20