2012-04-10 10 views
0

ich habe 3 Zeilen auf „Services“ Tabelle:Complex Mysql Zeichenfolge nicht Zeile zurückgibt

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

-1 ist eine keine bestehenden Obr, der Service 2 keine internationalen Obr enthält oder es wurde gelöscht.

, wenn ich mit select * from Services holen, es funktioniert wie erwartet, aber wenn ich meine Suche SQL tun:

select 
    *, 
    (select Name from Obrs where ID=ObrID) as ObrName 
from 
    Services 
where 
    (select Name from Obrs where ID=ObrID) like '%SEARCH_STRING%' 

es nicht die letzte Zeile zurück. Gibt es eine Möglichkeit, um es etwas zurückgeben wie:

ID | name | ObrID | ObrName 
0 | A | 1 | ObrA 
1 | B | 2 | ObrB 
3 | C | -1 | NULL 

Antwort

2

Sie möchten beitreten links verwenden.

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 

oder:

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

Wenn es keine Obrs.Name weil Ihr ObrID-1 ist, dann wird Obrs.Name sein NULL und daher nicht LIKE '%$SEARCH_STRING%'. Sie können eine zusätzliche Bedingung hinzu, auch diese Fälle umfassen:

where 
    (select Name from Obrs where ID=ObrID) like '%$SEARCH_STRING%' 
    OR ObrID = -1 

Und Flöcsy ‚s Vorschlag folgen und einen LEFT JOIN verwenden. Joins sind immer die bevorzugte Methode, insbesondere vs. korrelierte Subquerys. Die Arbeitsbedingung, wenn eine LEFT JOIN Verwendung ist

WHERE 
    Obrs.Name LIKE '%$SEARCH_STRING%' 
    OR Obrs.Name IS NULL 
+0

Yeah yeah, die unkommentiert downvote. Jemand muss mich wirklich hassen, seinen Ruf zu verschwenden. – Basti

0

Mai unten sein kann helfen:

select s.*,ob.Name from Services as s left join Obrs as ob on s.ID=ob.ObrID where ob.Name like '%$SEARCH_STRING%';