2009-08-19 29 views
0

我在我的數據庫中有兩個表一個是另一個是B A有幾個字段,其中三個是id,名稱,組 B有id,標題,描述等從mysql中的兩個表中找到同樣的數據

我必須搜索ID的標題和描述的那些具有類似於表A的名稱或羣組的數據,然後必須插入的ID在表A.

。例如一個字段, 如果A的名字中包含'Anna',而其中的'女孩'則需要搜索表B中包含這個單詞'Anna'或'girl'的標題和描述。

我想在一個單一的查詢中做到這一點。

我該怎麼做?

編輯: 蔭這裏explainng我的表以便更好地理解

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 

等等

看,我將首先搜索在表B的標題和描述的匹配「安娜」並且如果在他們中任何一箇中都找到了匹配,那麼我將在表A中僅將該ID存儲在'匹配ID'字段中 我將對'女孩'進行相同的處理,然後針對'悉尼'等

+0

如果我正確理解你,你想插入B.id到表A中的新/未列出的字段? – FrankS 2009-08-19 11:39:27

+0

問題仍然存在,如果您找到了匹配項,您想在哪裏放置ID?以及如果您找到多個匹配的ID會發生什麼? (對於團體來說很容易發生)。 – FrankS 2009-08-19 11:50:01

回答

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行
  • 不是100%肯定,如果你想/需要的順序時,你可能需要一些進一步的測試對於和如果需要使用順序
  • 也可能是最好使用一個額外的表組(以減少重複的條目),也許一個額外的映射表,這樣就可以從B中的所有結果映射到

編輯: 如果名稱必須完全匹配(不像女生/女孩),你可以只需在名稱前添加一個空格:'%',a.name,'%'。如果它變得更復雜,我會建議使用正則表達式(REGEX)。我用空格修改了查詢(僅用於名稱),所以請隨時再試一次。

+0

你的查詢已經完成了它,但現在的問題是,如果有一個像'LT'這樣的名字,那麼它甚至會在那些標題/ desc中給出匹配,其中確切的'LT'沒有被寫入。我正在諮詢。 在這個這個查詢是給LT的匹配,因爲我們在諮詢。 我想完全匹配這個單詞,它應該只匹配「我和LT一起走過」這樣的句子。 – developer 2009-08-20 10:44:08

+0

現在解決了您的問題嗎? – FrankS 2009-08-21 10:38:08

+0

添加另一個OR應該不是問題,只是因爲您接受並帶走了接受不能自己添加一個簡單的修改有點難過,這個查詢應該適合你在問題中指定的需求,並且很容易適應你的新需求。正如我在答案中所述,如果它也得到了複雜的,檢查REGEX – FrankS 2009-08-24 10:43:41

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 
相關問題