2009-08-19 16 views
0

データベースに2つのテーブルがあります。もう1つはBです AにはID、名前、グループの3つのフィールドがありません Bはid、title、説明等同様にmysqlの2つのテーブルのデータを見つける

iは、テーブルAの名前またはグループと同様のデータがあるタイトル及び説明のIDを検索し、テーブルA.例えば

のフィールドにIDを挿入するために持っている必要があり、 Aがその名前に「Anna」を持ち、そのグループに「girl」がある場合、この単語「Anna」または「Girl」を含む表Bのタイトルと説明を検索する必要があります。

これを1回のクエリで実行したいとします。

どうすればいいですか?

編集:より良く理解

table A 

id  name  group  matched_id 
1  anna  girl 
2  sydney girl 
3  max  boy        etc. 

Table B 

id  title          description 
1  A good girl        Anna is a very good girl 
2  Max doesnt work hard     Boys are always like that only 

などのためにここに私のテーブルをexplainng Iamは...

iは最初のテーブルBのタイトルと説明の「アンナ」の一致を検索します見ます一致が見つかった場合は、そのIDをテーブル 'A'のフィールド 'matched id'に保存します 'girl'と 'sydney'の同じ手順を実行します。

+0

私はあなたを正しく理解している場合は、B.idをテーブルAの新しい/指定されていないフィールドに挿入しますか? – FrankS

+0

まだ問題は残っています。一致するものを見つけたら、どこにIDを入れたいのですか?一致するIDが複数ある場合はどうなりますか? (グループのために簡単に起こります)。 – FrankS

答えて

0

このクエリは、トリックを行う必要があります。

UPDATE a SET matched_id = 
(SELECT b.id FROM b 
    WHERE b.title LIKE CONCAT(' % ',a.name,' % ') 
    OR b.description LIKE CONCAT('% ',a.name,' %') 
    OR b.title LIKE CONCAT('%',a.group,'%') 
    OR b.description LIKE CONCAT('%',a.group,'%') 
    LIMIT 1) 
WHERE EXISTS 
(SELECT a.id FROM b 
    WHERE b.title LIKE CONCAT('% ',a.name,' %') 
    OR b.description LIKE CONCAT('% ',a.name,' %') 
    OR b.title LIKE CONCAT('%',a.group,'%') 
    OR b.description LIKE CONCAT('%',a.group,'%') 
    LIMIT 1) 

これまでいくつかの発言:各サブクエリは、より股関節を返しますすることができますよう

  • LIMIT 1は、必要がありましたn 1行
  • あなたが望む/必要な注文が使用されているかどうか確信していない場合は、それ以上のテストを必要とする場合があります。
  • グループ用に余分なテーブル 名は(女の子/女の子と違って)完全に一致する必要がある場合は、次のことができます。あなたがEDIT

にBからすべての結果をマッピングすることができるように、(重複したエントリを減らすため)と、おそらく1つの余分マッピングテーブル名前の前にスペースを追加してください: '%'、a.name、 '%'。それがより複雑になるなら、私は正規表現(REGEX)の使用を提案します。スペース(名前のみ)を使用してクエリを変更しましたので、もう一度お試しください。

+0

あなたの質問はほぼ完了しましたが、問題は 'LT'のような名前があれば、正確な 'LT'が書かれていないそれらのタイトル/ descでもマッチしているということです。私は相談しています。 このクエリでは、私たちがコンサルティングしているように、LTとのマッチングが行われています。 単語を正確に一致させたい。「iとLTが一緒になった」のような文に一致する必要があります – developer

+0

これで問題は解決しましたか? – FrankS

+0

別のORを追加することは問題ではありません。あなた自身の簡単な変更を追加することはできません少し悲しいです。このクエリはあなたの質問に指定したニーズに合っていなければならず、新しいニーズに採用するのは非常に簡単です。 – FrankS

0
SELECT * 
FROM A 
JOIN B 
ON  b.title IN (a.name, a.group) 
     OR b.description IN (a.name, a.group) 
WHERE a.name = 'Anna' 
     AND a.group = 'girl' 

INDEX_UNION年代はMySQLには非常に効率的ではないので、(あなたのテーブルがInnoDBある場合は特に)、クエリを分割する方が良い場合があります。

SELECT * 
FROM (
     SELECT b.id 
     FROM A 
     JOIN B 
     ON  b.title IN (a.name, a.group) 
     WHERE a.name = 'Anna' 
       AND a.group = 'girl' 
     UNION 
     SELECT b.id 
     FROM A 
     JOIN B 
     ON  b.description IN (a.name, a.group) 
     WHERE a.name = 'Anna' 
       AND a.group = 'girl' 
     ) bo 
JOIN B 
ON  b.id = bo.id 
関連する問題