我当前正在使用以下查询通过 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' 并不总是存在,因此它会踢出整行。但当行中不存在时,我想保留该行并保留该列为空。我该如何解决这个问题?
最佳答案
我认为这里有几个问题,所以请耐心等待我解决这些问题:)
我同意@Jeurgen的观点,您需要使用LEFT JOIN
而不是INNER JOIN
,这将使您能够检索您正在搜索的所有行,包括m2
中没有条目的那些。
但是,由于您的 where 子句明确指出仅向我提供 m2.fldnr
值等于“123”的数据,因此您不拥有任何包含该值的行是正确的没有匹配的 m2
行,因为它们无法满足您的条件。
我认为您想要做的是从前四个表中提取所有数据,然后仅提取包含“123”的 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
希望有帮助:)
关于mysql - 具有不同 where 条件的多个内部联接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10430738/