2

私は2つのテーブルを持っています:

CREATE TABLE tblEatables (
    `EatId` int UNSIGNED PRIMARY AUTO_INCREMENT,
    `Fruits` varchar(9) NOT NULL
) Engine=InnoDB;

CREATE TABLE tblConfirm_Eatables (
    Eatables_Id INT UNSIGNED,
    Edible_Status INT,
    FOREIGN KEY Eatables_Id REFERENCES tblEatables (EatId)
) Engine=InnoDB;

Edible_Statusが0のtblConfirm_EatablesにあるすべてのtblEatables.Fruitsと、tblConfirm_Eatablesにないものをすべて選択したいと思います。

サンプルデータ:

INSERT INTO tblEatables
(`EatId`, `Fruits`)
    VALUES
(1, 'Apples'),
(2, 'Oranges'),
(3, 'Papaya'),
(4, 'Jackfruit'),
(5, 'Pineapple'),
(6, 'Mango');

INSERT INTO tblConfirm_Eatables
    VALUES
(1,0),
(2,1),
(3,0),
(4,0);

結果は次のようになります。

  果物
  アップル
  パパイヤ
  ジャックフルーツ
  パイナップル
  マンゴー

食用状態が「1」なので「オレンジ」はありませんのでご注意ください。

4

4 に答える 4

3

aを使用して、フルーツが他のテーブルに存在し、 0LEFT JOINではないかどうかを最初に判断できます。Edible_Status

SELECT    a.Fruits
FROM      tblEatables a
LEFT JOIN tblConfirm_Eatables b ON 
          a.EatId = b.Eatables_Id AND
          b.Edible_Status > 0
WHERE     b.Eatables_Id IS NULL

次に、WHERE句はtblEatables結合条件を満たさないすべての行を取得します。

Eatables_Idテーブルのフィールド( 、Edible_Status)に複合インデックスを作成すると、これは非常に高速になりtblConfirm_Eatablesます。


SQLFiddleデモ

于 2012-07-27T05:20:01.167 に答える
2

これを試して

SELECT fruits FROM tblEatables WHERE EatID 
 NOT IN
 (SELECT Eatbles_Id WHERE  Edible_Status = 1)
于 2012-07-27T05:23:28.920 に答える
1

MySQLをインストールしていませんが、SQLServerでインストールしました。これを試して

SELECT e.EatId,e.Fruits
FROM @tblEatables e 
LEFT JOIN @tblConfirm_Eatables ce ON e.EatId = ce.Eatbles_Id
WHERE ce.Edible_Status  = 0 OR ce.Edible_Status IS Null

結果

EatId   Fruits
1   Apples
3   Papaya
4   Jackfruit
5   Pineapple
6   Mango
于 2012-07-27T05:29:14.893 に答える
0

tblConfirm_Eatablesにないフルーツを含めるには、左結合を使用します。右側のテーブルから欠落している値はNULL値になります。あなたの声明

Edible_Statusが0で、tblConfirm_Eatablesにないもの

したがって、

tblConfirm_Eatables.Edible_Status = 0 OR tblConfirm_Eatables.Edible_Status IS NULL

全体的なステートメントは次のようになります。

SELECT Fruits
  FROM tblEatables AS E
    LEFT JOIN tblConfirm_Eatables AS CE ON E.EatID = CE.Eatables_ID
  WHERE CE.Edible_Status = 0 OR CE.Edible_Status IS NULL

オフトピック

テーブル名に追加された「tbl」プレフィックスは冗長です。そのままにしておく方がよいでしょう。

于 2012-07-27T05:20:58.470 に答える