2017-01-12 2 views
-3

Например, у меня есть, что таблицаSQL: найти слова, которые повторяются в разных строках таблицы

id  title 
1  abcd apple 
2  adqsdd google 
3  adzdaz android 
4  gdfgdfg apple 
5  yuiyu windows 

так, мы можем видеть, что слово «яблоко» повторяется в разных строках. Как я могу сделать SQL-запрос, который будет отображаться, кто эти слова повторяются в разных строках, поэтому он будет отображать меня: «яблоко»

+0

Попробуйте [regex] (http://dev.mysql.com/doc/refman/5.7/ru/regexp.html#operator_regexp) с номером –

ответ

0

Единственный реальный способ сделать это, если у вас есть список слова. Если это так:

select w.word, count(*) 
from words w join 
    t 
    on concat(' ', t.title, ' ') like concat('% ', w.word, ' %') 
group by w.word 
having count(*) > 1; 

EDIT:

Если у вас нет слов, но вы знаете, что «название» имеет фиксированное количество слов, вы можете создать доступные слова. Например, если все заголовки имеют не более 4 слов:

select w.word, count(*) 
from (select substring_index(title, ' ', 1) as word union 
     select substring_index(substring_index(title, ' ', 2), ' ', -1) union 
     select substring_index(substring_index(title, ' ', 3), ' ', -1) union 
     select substring_index(substring_index(title, ' ', 4), ' ', -1) 

    ) w join 
    t 
    on concat(' ', t.title, ' ') like concat('% ', w.word, ' %') 
group by w.word 
having count(*) > 1; 

Возможно, вы можете обобщить это на более длинные титры.

+0

не будет регулярным выражением со счетчиком, который не работает и будет быстрее вместе с меньше кода? –

+0

название неизвестного столбца в списке полей – user3134277

0

Читайте дальше на GROUP BY и HAVING, эти два варианта позволят вам выбрать такие условия (используя HAVING COUNT(*)>1 и т.п.).

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