多个内部联接具有不同的where-conditions

时间:2012-05-03 11:48:22

标签: mysql sql select join inner-join

我目前正在使用以下查询通过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'并不总是存在,因此它会踢出整行。但是我想保留行并在行中不存在时将列保持为空。我该如何解决这个问题?

3 个答案:

答案 0 :(得分:2)

将所有inner join替换为left outer join

答案 1 :(得分:2)

我认为这里有几个问题,所以当我经历它们时请耐心等待:)

我同意@Jeurgen您需要使用LEFT JOIN而不是INNER JOIN,这将使您能够检索您要搜索的所有行,包括{{1中没有条目的行}}

但是,由于你的where子句明确指出只给我那个m2值等于'123'的数据,那么你没有任何没有匹配的行是正确的{{ 1}}行,因为它们不符合您的标准。

我认为你要做的是从前四个表中提取所有数据,然后只包含m2.fldnr表中包含'123'的数据,如果是这种情况,那么你需要重新定位您的m2过滤器,并处理丢失的行...

我的查询版本如下 - 这个尚未经过测试,因为我没有结构的样本数据,但试一试,如果需要可以改变它;

m2

希望有所帮助:)

答案 2 :(得分:0)

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