2009-08-19 118 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 
相关问题