将两张桌子组合在一起,以便一张桌子上的所有行都与另一张桌子上的每一行相匹配
问题描述:
这个问题对我来说有点困难,但我想我已经想出了一个可以实现这个想法的例子。将两张桌子组合在一起,以便一张桌子上的所有行都与另一张桌子上的每一行相匹配
我有三个表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 |
==================================
注意结果,这是我正在努力的工作要做,上面的表格是不是我工作的实际表但是他们是我必须与之合作的一个很好的例子。
我试图使用某种左或右连接,但我没有得到我在找什么。
在此先感谢您的帮助。
答
我认为这是你要找的。
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
查找'union'关键字 – asawyer 2012-04-20 15:40:36
@asawyer我看着它,我无法弄清楚如何使用它得到的结果,我寻找。如果您可以给出一个很好的示例查询。谢谢 – 2012-04-20 16:09:29