2012-05-03 11 views
1

現在、次のクエリを使用してINNER JOINを介して複数のテーブルを検索しています。 db_itemvの異なる内部条件を持つ複数の内部結合

SELECT title, m2.txt1 AS teaser, inputdat, db_file.* 
     FROM db_item 
      INNER JOIN db_itemv AS m1 USING(id_item) 
      INNER JOIN db_itemf USING(id_item) 
      INNER JOIN db_itemd USING(id_item) 
      INNER JOIN db_itemv AS m2 USING(id_item) 
     WHERE type=15 AND m1.fldnr='12' 
AND m1.indik='b' AND m1.txt1s='en' 
AND visibility=0 AND inputdat>'2005-11-02' AND m2.fldnr='123' 
     GROUP BY title 
     ORDER BY inputdat DESC 
     LIMIT 0,100 

列(M1、M2)が命名される:

ID id_item fldnr indik txt1 

一つid_itemは複数の行に存在してもよいです。

私の問題は、m2.fldnr = '123'は必ずしも存在しないため、行全体がキックアウトされるということです。しかし、私は行を保持し、その行に存在しないときは列を空にしておきたい。どうすれば問題を解決できますか?

+1

は '左外側join' –

答えて

1

は、私は問題のカップルがここにあると思いますので、私はそれらを介して:)あなたが取得することができますされ、INNER JOINの代わりにLEFT JOINを使用する必要があり、私は@Jeurgenに同意

行きながら、私と一緒にクマm2にエントリがないものも含めて、検索しているすべての行。

しかし、あなたのwhere節には、m2.fldnrの値が '123'に等しいデータだけが与えられていると明記されているので、一致する行がないようにしてください。m2あなたの基準を満たすことができません。

最初の4つのテーブルからすべてのデータを取り出し、次に12332が入っているm2テーブル内のデータのみをプルすることをお勧めします。この場合はm2.fldnrフィルタを再配置する必要がありますこれらの欠落した行を処理します。

私のバージョンのクエリは次のようになります。これはテストされていません。あなたの構造にサンプルデータはありませんが、試してみてください必要に応じて;

SELECT title, m2.txt1 AS teaser, inputdat, db_file.* 
FROM db_item 
    INNER JOIN db_itemv AS m1 USING(id_item) 
    INNER JOIN db_itemf USING(id_item) 
    INNER JOIN db_itemd USING(id_item) 
    LEFT JOIN db_itemv AS m2 
     ON db_item.id_item = m2.id_item 
     AND (m2.fldnr = '123' OR m2.fldnr IS NULL) 
WHERE type=15 
    AND m1.fldnr = '12' 
    AND m1.indik = 'b' 
    AND m1.txt1s = 'en' 
    AND visibility = 0 
    AND inputdat > '2005-11-02' 
GROUP BY title 
ORDER BY inputdat DESC 

私のための問題を解決していないようです:)

+0

魅力的な作品です!きちんとした説明とクエリに感謝します:) – blacktea

2

は、私はあなたがdb_itemvリターンがNULL場合でも、他のすべてのデータを返す必要があります代わりにLEFT JOININNER JOIN db_itemv AS m2 を使うべきだと思うleft outer join

+0

を使用することができます希望。最後の結合なしでクエリ全体を実行し、最後のWHERE条件を実行すると、結果のカウントはかなり異なります。別の考えがありますか? – blacktea

0

を持つすべてのinner joinを交換してください。

関連する問題