从mysql中的两个表中找到相同的数据

时间:2009-08-19 11:33:28

标签: php sql select mysql

我的数据库中有两个表,另一个是B A有几个字段,其中三个是id,name,group B有id,标题,描述等字段。

我必须搜索具有类似于表A的名称或组的数据的标题和描述的id,然后必须在表A的字段中插入id。

例如, 如果A的名字中有'Anna',而其组中有'girl',那么我必须搜索表B中包含这个单词'Anna'或'girl'的标题和描述。

我想在一个查询中执行此操作。

我该怎么办?

编辑: 为了更好的理解,我在这里解释了我的表格

 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的标题和描述中搜索'anna'的匹配项,如果在其中任何一个中找到匹配,那么我将仅在字段'匹配的id'中将该ID存储在表A中 我会为'女孩'做同样的程序,然后为'悉尼'等做同样的程序

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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是必要的,因为每个子查询可以并且将返回超过1行
  • 不是100%确定是否使用了您想要/需要的订单,您可能需要进一步测试并按需使用订单
  • 最好为组使用额外的表(以减少重复的条目),也可以使用一个额外的映射表,这样就可以将所有结果从B映射到A

修改 如果名称需要完美匹配(与女孩/女孩不同),您只需在名称前面添加一个空格:'%',a.name,'%'。如果它变得更复杂,我建议使用正则表达式(REGEX)。我用空格修改了查询(仅限名称),所以请随意再试一次。