【问题标题】:find likewise data from two tables in mysql从mysql中的两个表中查找同样的数据
【发布时间】:2009-08-19 11:33:27
【问题描述】:

我的数据库中有两张表,一张是A,另一张是B A 的字段很少,其中三个是 id、name、group B 有 id、title、description 等字段。

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

例如, 如果 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 存储在表 A 中的“匹配 id”字段中 我将对“女孩”执行相同的程序,然后对“悉尼”执行相同的程序,以此类推

【问题讨论】:

  • 如果我理解正确,您想将 B.id 插入到表 A 中的新/未列出字段中吗?
  • 问题仍然存在,如果找到匹配项,您想将 ID 放在哪里?如果您找到多个匹配的 ID 会怎样? (对于团体来说很容易发生)。

标签: php sql select mysql


【解决方案1】:

这个查询应该可以解决问题:

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% 确定是否使用了您想要/需要的订单,您可能需要对此进行进一步测试,并在需要时使用 order by
  • 最好为组使用一个额外的表(以减少重复条目)和一个额外的映射表,这样您就可以将所有结果从 B 映射到 A

编辑: 如果名字需要完美匹配(不像女孩/女孩),你可以在名字前面添加一个空格:'%',a.name,'%'。如果它变得更复杂,我建议使用正则表达式(REGEX)。我用空格修改了查询(仅用于名称),请随时重试。

【讨论】:

  • 您的查询几乎已经完成了,但现在的问题是,如果有一个像“LT”这样的名称,那么即使没有写出确切的“LT”的那些标题/描述,它也会给出匹配。例如.我正在咨询。在这个查询中,我们在咨询中提供了 LT 的匹配项。我想完全匹配这个词。它应该只匹配“我和LT一起”这样的句子
  • 添加另一个OR应该不是问题,仅仅因为你不能自己添加一个简单的修改而接受和取消接受有点难过。此查询应符合您在问题中指定的需求,并且很容易适应您的新需求。正如我在答案中所说,如果它变得太复杂,请检查 REGEX。
  • 我知道我可以在这个查询中添加另一个 OR,这根本不是问题......问题是我不想在我的查询中一次又一次地写,也不想做它很复杂。我只检查正则表达式,但我想是否有人可以帮助我处理正则表达式,因为我需要快速完成这项工作。无论如何,谢谢!
【解决方案2】:
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_UNIONMySQL 中的效率不是很高,因此拆分查询可能会更好(尤其是如果您的表是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

【讨论】:

    猜你喜欢
    • 2014-01-18
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多