2012-04-13 12 views
1

私は、MySQLを使用していくつかの分野で結果を見つけることのようなものエンジンを作成しています使用しているときの結果と一致するフィールドを知ることができます。MySQLの - どのように私は論理和

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; 

をしかし、今、私がどのフィールド知っている必要がありますがキーワードと一致します...どうすればいいですか?

私はPHPを使用しています。

答えて

2

未検証:

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

あなたは

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%') 

を行い、その後targetがTABLE1またはtable2のあなたのループでは結果に

0

を取得するとき、あなたがこれを行うことができているかどうかを確認できます。

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が、これは単にプロセッサをしていないですが、より多くの作業を行いますか?あなたはすでにMySQLで文字列のマッチングを行っていますが、なぜPHPで再びそれをしますか? – liquorvicar

+0

まずは簡単です。第二に、それはより多くのプロセッサラウンドを取るが、もしMySQLの仕事が少ないなら、あなたのMySQLサーバーはより高速である、これを知らなかったか? ... –

1

あなたが追加することができますあなたの条件の列

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

違いがありますが、SELECTとWHEREの両方でLIKEを使用すると、MySQLが一致を2回行う可能性があります。文字列のマッチングは高価になる可能性があります(特にORでは)ので、SELECTでマッチングを行い、HAVINGを使用して結果をフィルタリングする方が良いでしょうか? – liquorvicar

+0

HAVINGは一般的にそれほど優れていません。場合によっては、フィルタリングする前に完全な結果セットを生成して、すべてをクロールまで遅くする必要があります。この場合、SELECT部分​​の条件は一致する行についてのみ評価されるため、大きな影響はないと思います。 – ESG

関連する問題