检索一个查询中`name` LIKE%current_name的所有id

时间:2015-02-07 14:51:15

标签: mysql mysqli

我有一张表:

id | name
1  | gecko
2  | b-gecko
3  | c-gecko
4  | toucan
5  | s-toucan

我想在单个查询idnamelookalike字段中检索。类似的东西:

id | name   | lookalike
1  | gecko  | 1,2,3
4  | toucan | 4,5

...或者喜欢:

id | name   | lookalike
1  | gecko  | 2
1  | gecko  | 3
4  | toucan | 5

这甚至可能吗?我在该表中有50,000条记录,如果逐行检查,则需要对每条记录进行大量简单查询。

我认为查询应该类似于:

SELECT t1.`id`, t1.`name`, (SELECT t2.`id` FROM `table1` t2 WHERE t2.`name` LIKE CONCAT('%', t1.`name`)) as `lookalike` FROM `table1` t1

......但是我错过了一个结论。谢谢!

LE:即使使用

SELECT t1.`id`, t1.`name`, (SELECT GROUP_CONCAT(id SEPARATOR ',') FROM `table1` t2 WHERE t2.`name` LIKE CONCAT('%', t1.`name`) AND t1.name<>t2.name) as `lookalike` FROM `table1` t1

由于需要检查大量行,我遇到了很多服务器崩溃。我知道我的情况最糟糕,但是我试图弄清楚如何优化它。

对于我试过的第二个版本

SELECT 
    t.id,
    t.name,
    t2.id
FROM 
    table1 t 
LEFT JOIN 
    table1 t2 
ON 
    t2.name LIKE CONCAT('%', t.name)

但是这个也崩溃了服务器。

1 个答案:

答案 0 :(得分:1)

Mysql有一个GROUP_CONCAT函数,它允许您将子查询转换为字符串。

此外,将行本身包含在内是没有用的,所以你应该过滤掉子查询中的原始动物

以下是您如何执行此操作的示例。

SELECT *,
   (SELECT GROUP_CONCAT(id SEPARATOR ', ')
   FROM table1
   WHERE `name` LIKE '%toucan%'
   AND `name` != 'toucan') as lookalikes
FROM table1
WHERE `name` = 'toucan'

这里的结果是

id | name    | lookalikes
4  | toucan  | 5