2016-05-30 2 views
0

У меня есть таблица с тремя столбцами: id, предложение и язык. Так предложения могут быть либо на английском и немецком языках, идентификаторы присваиваются предложениям с таким же значением, но на разных языках, какЗапрос Mysql с группой

ID | sentence | language 
1 | Hello | en 
1 | Hallo | de 
2 | Sorry | en 

там могут быть предложения, которые существуют только на одном языке. Теперь я хочу, чтобы найти все предложения, которые доступны как в языке, я могу сделать с:

SELECT 
    * 
FROM 
    `sentences` 
WHERE 
    LENGTH(sentence) > 0 
     AND (language = 'en' OR language = 'de') 
GROUP BY id 
HAVING COUNT(language) = 2 

и я получаю результаты предложений только на немецком языке. Затем я делаю

SELECT 
    * 
FROM 
    sentences 
WHERE 
    id IN (SELECT 
      id 
     FROM 
      `sentences` 
     WHERE 
      LENGTH(sentence) > 0 
       AND (language = 'en' OR language = 'de') 
     GROUP BY id 
     HAVING COUNT(language) = 2) 

Это должно работать, но запрос берет навсегда. Мой вопрос: есть ли какой-нибудь причудливый способ сделать это?

+0

Определение 'фантазии'. – Strawberry

+0

, определяемый ответом Тин Тран. – boreas

ответ

2

ВНУТРЕННИЙ JOINS быстрее, чем при использовании в пункте

SELECT en.id, 
     en.sentence as en_sentence, 
     de.sentence as de_sentence, 
     en.language as en_language, 
     de.language as de_language 
FROM sentences en 
INNER JOIN sentences de ON en.ID = de.ID AND en.language = 'en' AND de.language = 'de' 
WHERE length(en.sentence) > 0 
AND length(de.sentence) > 0 
+1

Да, но функции не могут использовать индексы, поэтому еще может быть место для дальнейшей оптимизации – Strawberry

+0

как удаление пустых данных, таких как другой ответ –

1

Удалить ваши предложения, которые имеют длину 0, если ваши данные разрешения. Резервное копирование перед запуском:

DELETE FROM sentences WHERE LENGTH(SENTENCE) = 0 

выньте выбор * и получите все, что хотите. Если у вас нет индексов, добавьте комбинированный индекс на язык и идентификатор.

Это оставляет вас с

SELECT 
    ID, sentence, language. 
FROM 
    `sentences` 
WHERE 
    language = 'en' OR language = 'de' 
GROUP BY id 
HAVING COUNT(language) = 2 
+0

хорошее предложение для удаления пустых данных. Но группировка по идентификатору потеряет предложение и язык для другого языка. –

+0

Вы бы хотели, чтобы это произошло за счет счета. Компромисс между моим и вашим - это то, что я могу развить мои языки и увеличить счет и изменить язык на IN, без изменения кода, однако мне нужно сделать COUNT. –

+0

, но код должен обрабатывать языки в любом случае ... с этой GROUP BY, нет гарантии, какой язык вы получаете, просто выбирает один –

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