2012-04-13 10 views
1

ich einen Motor bin Erstellen zu finden Ergebnisse in verschiedenen Bereichen mit MySQL, so etwas wie:MySQL - Wie kann ich wissen, welches Feld paßt das Ergebnis, wenn OPs mit

SELECT table1.*, table2.* FROM table1 
JOIN table2 
ON table1.id = table2.tid 
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%') 
AND 
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%') 
ORDER BY table1.id ASC; 

Aber jetzt muß ich wissen, welches Feld entspricht dem Schlüsselwort ... Wie kann ich das tun?

BTW, ich benutze PHP.

Antwort

2

ungeprüfter:

SELECT table1.*, 
     table2.*, 
     case (table2.field1 LIKE 'keyword%' and table1.field1 LIKE 'keyword%') 
      when 1 
      then 'f1' 
      else 'f2' 
     end as field 
FROM table1 
... 
1

Sie könnten tun

SELECT table1.*, table2.*, 'table1' as `target` as FROM table1 
JOIN table2 
ON table1.id = table2.tid 
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%') 
UNION ALL 
SELECT table1.*, table2.*,'table2' as target FROM table1 
JOIN table2 
ON table1.id = table2.tid 
WHERE 
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%') 

und dann prüfen, ob target tabelle1 oder table2 ist, wenn Sie die Ergebnisse abrufen

0

In der Schleife Sie dies tun können:

Table X 
Field1  Field2 
------------------- 
boat  caca 
hello  boat 

$Keyword = 'boat'; 
while($Res = blabla){ 
    if(strpos($Res['Field1'], $Keyword) !== false){ 
     echo 'String found in Field 1<br />'; 
    } 

    if(strpos($Res['Field2'], $Keyword) !== false){ 
     echo 'String found in Field 2<br />'; 
    } 
} 

// Will output 
String found in Field 1<br /> 
String found in Field 2<br /> 
+0

-1 Ist das nicht der Prozessor nur dafür tun mehr Arbeit? Sie haben den String-Abgleich bereits in MySQL durchgeführt, warum wiederholen Sie ihn in PHP? – liquorvicar

+0

Weil es zuerst einfacher ist. Zweitens braucht es mehr Prozessor-Runden, aber wenn MySQL weniger Arbeit hat, ist Ihr MySQL-Server schneller, wusstest du das nicht? ... –

1

Sie könnten hinzufügen Spalten für Ihre Bedingungen

SELECT table1.*, table2.*, 
table1.field1 LIKE 'keyword%' AS Table1Field1Match, 
table1.field2 LIKE 'keyword%' AS Table1Field2Match, 
table2.field1 LIKE 'keyword%' AS Table2Field1Match, 
table2.field2 LIKE 'keyword%' AS Table2Field2Match 
FROM table1 
JOIN table2 
ON table1.id = table2.tid 
WHERE 
(table1.field1 LIKE 'keyword%' OR table1.field2 LIKE 'keyword%') 
AND 
(table2.field1 LIKE 'keyword%' OR table2.field2 LIKE 'keyword%') 
ORDER BY table1.id ASC; 
+0

Nicht sicher, ob es einen Unterschied machen würde, aber das LIKE sowohl in SELECT als auch in WHERE zu haben, könnte MySQL das Match zweimal machen lassen. String-Matching kann teuer sein (besonders bei ORs). Vielleicht ist es besser, das Matching in SELECT zu machen und HAVING zu verwenden, um die Ergebnisse zu filtern. – liquorvicar

+0

HAVING ist im Allgemeinen nie besser. In einigen Fällen muss das vollständige Ergebnis dennoch generiert werden, bevor es gefiltert wird. Dadurch wird alles zum Crawlen verlangsamt. In diesem Fall, da die Bedingungen im SELECT-Teil nur für übereinstimmende Zeilen ausgewertet werden, glaube ich nicht, dass dies eine große Auswirkung haben wird. – ESG