0

我在“服务”表上有 3 行:

ID | name | ObrID
 0 |   A  |  1
 1 |   B  |  2
 2 |   C  |  -1

-1 是不存在的 Obr,服务 2 不包含任何 Obr 或已被删除。

如果我用 fetch 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
4

3 回答 3

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
于 2012-04-10T11:20:14.123 回答
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%';
于 2012-04-10T11:27:17.550 回答
-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
于 2012-04-10T11:19:46.337 回答