2

現在、次のクエリを使用して、INNER JOIN を介して複数のテーブルで検索を実行しています。

    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

db_itemv の列 (m1、m2) の名前は次のとおりです。

ID   id_item   fldnr   indik   txt1

1 つの id_item が複数の行に存在する場合があります。

私の問題は、 m2.fldnr='123' が常に存在するとは限らないため、行全体が追い出されることです。しかし、行を保持し、行に存在しない場合は列を空に保ちたいです。どうすれば問題を解決できますか?

4

3 に答える 3

2

ここにはいくつかの問題があると思いますので、それらについて説明するまでの間、ご容赦ください :)

LEFT JOINの代わりに使用する必要があるという@Jeurgenに同意しますINNER JOIN。これにより、検索しているすべての行を取得できます。これには、エントリのないものも含まれm2ます。

ただし、where 句が「123」に等しい値を持っているデータのみを提供すると具体的に述べているため、基準を満たすことができないため、m2.fldnr一致する行を持たない行を持たないことは正しいことです。m2

あなたがしようとしているのは、最初の 4 つのテーブルからすべてのデータを取得し、次にm2「123」を含むテーブル内のデータのみを取得することだと思います。その場合は、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

それが役立つことを願っています:)

于 2012-05-03T12:23:00.423 に答える
2

すべてinner joinleft outer join

于 2012-05-03T11:51:53.653 に答える
0

NULL を返す 場合でも、他のすべてのデータを返すLEFT JOIN代わりに使用する必要があると思います。INNER JOIN db_itemv AS m2db_itemv

于 2012-05-03T11:59:36.320 に答える