2015-02-07 2 views
1

У меня есть таблица, как:Получить все идентификаторы, где `name` LIKE% current_name в одном запросе

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 

... но я отсутствую CONCAT. Спасибо!

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 

я получаю много аварий сервера из-за большое количество строк, которые будут проверены. Я знаю, что у меня самая худшая ситуация для LIKE, но я пытаюсь понять, как ее оптимизировать.

Для 2-й версии я попытался

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

, но это один выходит из строя сервер тоже.

+0

от где поле 'lookalike' приходит? – Jens

+0

Он создается подзапросом, который ищет идентификаторы строк с именем 'name', заканчивающимся так же, как и исходная строка ... Прошу прощения за мое объяснение, но, пожалуйста, посмотрите, что является желаемым результатом. – valicu2000

+0

И что такое результат вашего запроса? – Jens

ответ

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 
+0

Сервер продолжает сбой при использовании этого метода. Есть 2,5 миллиарда строк, которые проверяются :(... есть способ игнорировать строки в результате, если 'lookalikes' IS NULL или равно ''? – valicu2000

+0

Вы можете посмотреть в оптимизацию ваши запросы с индексами. Я не знаю, знаете ли вы? Вы можете сделать это с помощью инструкции EXPLAIN. Вот некоторые материалы для чтения: http://dev.mysql.com/doc/refman/5.0 /en/using-explain.html –

+0

В дополнение к этому, я действительно не вижу смысла извлекать данные так, как вы это делаете. Предположим, вы снова запросите базу данных, чтобы получить данные для просмотра. Вы можете просто получить идентификаторы lookalikes, вместо того, чтобы добавлять имя и поле id исходной строки. В этом случае запрос можно упростить до 'SELECT GROUP_CONCAT (id) FROM test WHERE name LIKE '% toucan%'' –

Смежные вопросы