我有3行"服务"表:
ID | name | ObrID
0 | A | 1
1 | B | 2
2 | C | -1
-1是一个不存在的Obr,服务2不包含任何Obr或它被删除。
如果我使用select * from Services
获取,它会按预期工作,但如果我执行搜索sql:
select
*,
(select Name from Obrs where ID=ObrID) as ObrName
from
Services
where
(select Name from Obrs where ID=ObrID) like '%SEARCH_STRING%'
它没有返回最后一行。有没有办法让它返回类似的东西:
ID | name | ObrID | ObrName
0 | A | 1 | ObrA
1 | B | 2 | ObrB
3 | C | -1 | NULL
答案 0 :(得分:2)
您想使用左连接。
http://www.tizag.com/mysqlTutorial/mysqlleftjoin.php
SELECT s.*,o.ObrName from Services s
LEFT JOIN Obrs o ON ID=ObrID
WHERE OrbName LIKE '%$SEARCH_STRING%' OR OrbName IS NULL
或:
SELECT * FROM (select s.*,o.ObrName from Services s
LEFT JOIN Obrs o ON ID=ObrID) tmp
WHERE OrbName LIKE '%$SEARCH_STRING%' OR OrbName IS NULL
答案 1 :(得分:0)
可能在下面可以帮助:
select s.*,ob.Name from Services as s left join Obrs as ob on s.ID=ob.ObrID where ob.Name like '%$SEARCH_STRING%';
答案 2 :(得分:-1)
如果由于Obrs.Name
为ObrID
而没有-1
,则Obrs.Name
将为NULL
,因此不会为LIKE '%$SEARCH_STRING%'
。您可以添加其他条件以包括这些情况:
where
(select Name from Obrs where ID=ObrID) like '%$SEARCH_STRING%'
OR ObrID = -1
按照Flöcsy的建议并使用LEFT JOIN
。连接始终是首选方法,尤其是相对于相关子系统。使用LEFT JOIN
时的工作条件是
WHERE
Obrs.Name LIKE '%$SEARCH_STRING%'
OR Obrs.Name IS NULL