我的数据库中有两个表,另一个是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中 我会为'女孩'做同样的程序,然后为'悉尼'等做同样的程序
答案 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)
对此有一些评论:
修改强> 如果名称需要完美匹配(与女孩/女孩不同),您只需在名称前面添加一个空格:'%',a.name,'%'。如果它变得更复杂,我建议使用正则表达式(REGEX)。我用空格修改了查询(仅限名称),所以请随意再试一次。