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

一个 id_item 可能存在于多行中。

我的问题是, m2.fldnr='123' 并不总是存在,因此它会踢出整行。但是我想保留该行并在该行中不存在该列时保持该列为空。我该如何解决这个问题?

4

3 回答 3

2

全部替换inner joinleft outer join

于 2012-05-03T11:51:53.653 回答
2

我认为这里有几个问题,所以在我解决这些问题时请耐心等待:)

我同意您需要使用 @JeurgenLEFT JOIN而不是INNER JOIN,这将使您能够检索您正在搜索的所有行,包括那些在m2.

但是,由于您的 where 子句明确指出只给我具有m2.fldnr等于“123”的值的数据,那么您没有任何不匹配m2行的行是正确的,因为它们不符合您的标准。

我认为您要做的是从前四个表中提取所有数据,然后只提取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 回答
0

我认为您应该LEFT JOIN改用INNER JOIN db_itemv AS m2 它,即使db_itemv返回 NULL 也应该返回所有其他数据。

于 2012-05-03T11:59:36.320 回答