0

この質問を定式化するのは少し難しいですが、アイデアを広めるための例を思いついたと思います。

私は3つのテーブルbird_brd、state_stt、およびbird_in_state_bisを持っています

最初の2つのテーブルは単なるリストであり、3番目のテーブルは他の2つのテーブルを結合する方法であり、ある状態で鳥が見られた回数のカウントフィールドがあります。

テーブルの構造はそれほど重要ではないと思いますが、ここに基本があります

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   |
==================================

これは私が仕事のためにやろうとしていることであり、上記のテーブルは私が作業している実際のテーブルではありませんが、私が作業しなければならない構造の良い例であることに注意してください。

ある種の左結合または右結合を使用しようとしましたが、探しているものが得られません。

助けてくれてありがとう。

4

1 に答える 1

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;

最初に、使用されているすべての州と利用可能なすべての鳥にわたってデカルト結合を実行して、すべての可能な組み合わせを取得します。次に、元の 3 つのテーブルに結合して、鳥、州、およびカウントの名前を取得します。このような結合では、カウントが使用できない場合は null になるため、IFNULL関数を使用してすべての null を 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)
于 2012-04-20T16:40:29.677 に答える