2

別のテーブルにリンクする複数のレコードを持つことができる2つのテーブルがありますが、mySQLで行を結合したくありません。例:

  • test_mainには、フィールドmainID、field1が含まれています。
  • test_vegには、野菜の名前が付いたレコードが含まれており、ID=1のtest_mainのレコードにリンクされています。
  • test_fruitには、それぞれフルーツの名前を持つ2つのレコードが含まれており、どちらもID=1のtest_mainのレコードにリンクされています。

この例では、test_mainにリンクする3つのレコード(1つはtest_veg、2つはtest_fruit)があります。これらの3つの行を取得して、次のような結果を取得したいと思います。

field1               vegName  fruitName
-------------------  -------  ---------
stuff in main table  cabbage  NULL
stuff in main table  NULL     apple
stuff in main table  NULL     pear

また、test_vegまたはtest_fruitレコードがリンクされていないtest_mainのレコードが必要です。

これはとても単純に思えますが、私はそれを機能させることができません。何か案は?

テーブルが2つしかない場合(たとえば、test_mainとtest_veg)、左結合が機能します。3つのテーブルでは、2つの左結合は2つの行のみを返します。

SELECT  test_main.field1, test_veg.vegName, test_fruit.fruitName
FROM test_main
LEFT  JOIN test_veg ON test_veg.mainID = test_main.mainID
LEFT  JOIN test_fruit ON test_fruit.mainID = test_main.mainID
WHERE test_main.mainID=1

field1               vegName  fruitName
-------------------  -------  ---------
stuff in main table  cabbage  apple
stuff in main table  cabbage  pear

NB私はmySQL3で立ち往生しています。これは、WHERE内のSELECTやUNIONのような派手なものがないことを意味します。

4

2 に答える 2

2

MySQL3.xをだましてを模倣することについて私がしばらく前に読んだ非常にクールな記事がありますUNION。ユニオンに必要な数の行を含むDUMMYテーブルを作成する必要があります。したがって、1つのユニオン(2つの異なるselectステートメント)がある場合、ダミーテーブルに2つの行が必要になります。

次のようなものを試してください。

SELECT m.field1, v.vegName, f.fruitName
FROM test_main m
INNER JOIN dummy d 
  ON d.id < 3
LEFT JOIN test_veg v 
  ON v.mainID = m.mainID 
  and d.id = 1
LEFT JOIN test_fruit f 
  ON f.mainID = m.mainID 
  and d.id = 2
WHERE m.mainid=1

これがSQLフィドルです。

于 2013-01-17T17:13:55.577 に答える
0

whereクエリでは、句に次を追加できます。

test_veg.mainID is NULL and test_fruit.main_id is NULL

これにより、果物でも野菜でもない主なものが得られます。

ただし、データに問題があると思います。

同じ出力行のすべてが同じMaindIDを持ちます。mainIDしたがって、キャベツはリンゴやナシと同じである必要があります。ただし、質問を正しく理解していれば、mainIdはリンゴとナシのようなものを区別しているはずです。

于 2013-01-17T17:11:13.683 に答える