我有一张表:
id | name
1 | gecko
2 | b-gecko
3 | c-gecko
4 | toucan
5 | s-toucan
我想在单个查询id
,name
和lookalike
字段中检索。类似的东西:
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)
但是这个也崩溃了服务器。
答案 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