несколько объединений, каждое с оператором IN возвращает слишком много результатов - PullRequest
0 голосов
/ 11 марта 2020

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

, поэтому пример кода:

SELECT cars.model
FROM cars
LEFT JOIN parts ON parts.id = cars.partId AND parts.language IN ('en', 'de')
LEFT JOIN interior ON interior.id = cars.interiorId AND interior.language IN ('en', 'de')
LEFT JOIN exterior ON exterior.id = cars.exteriorId AND exterior.language IN ('en', 'de')
LEFT JOIN wheels ON wheels.id = cars.wheelId AND wheels.language IN ('en', 'de')
LEFT JOIN extra ON extra.id = cars.extraId AND extra.language IN ('en', 'de')
WHERE cars.id IN ('72727272') AND cars.source = 1

Мне нужны два результата из запроса (один на английском sh и один на немецком), вместо этого я получаю 24 результата. Они имеют различную конфигурацию языков.

Я попытался добавить:

  • GROUP BY ..., но он не работает.
  • DISTINCT такой же, как указано выше

Может быть, кто-то знает некоторые хитрости о том, как справиться с подобной ситуацией (в худшем случае я могу выполнить запрос дважды для каждого языка, но это крайне медленно).

Ответы [ 2 ]

1 голос
/ 11 марта 2020

Проблема, с которой вы столкнулись, связана с тем, что детали, детали интерьера, экстерьера и т. Д. Объединяются друг с другом независимо от language. Вы получаете каждую комбинацию связанных de и en данных.

SELECT cars.model
FROM cars
CROSS JOIN (SELECT 'en' AS language UNION SELECT 'de') AS l
LEFT JOIN parts ON parts.id = cars.partId AND parts.language = l.language
LEFT JOIN interior ON interior.id = cars.interiorId AND interior.language = l.language
LEFT JOIN exterior ON exterior.id = cars.exteriorId AND exterior.language = l.language
LEFT JOIN wheels ON wheels.id = cars.wheelId AND wheels.language = l.language
LEFT JOIN extra ON extra.id = cars.extraId AND extra.language = l.language
WHERE cars.id IN ('72727272') 
   AND cars.source = 1

Кроме того, я предполагаю, что полный запрос вы пытаетесь SELECT s больше, чем просто cars.model; в противном случае все это JOIN бессмысленно.

1 голос
/ 11 марта 2020

Не могли бы вы попытаться поставить условие соединения на языке, как показано ниже:

SELECT distinct cars.model
FROM cars
LEFT JOIN parts ON parts.id = cars.partId AND parts.language IN ('en', 'de')
LEFT JOIN interior ON interior.id = cars.interiorId AND interior.language =parts.language 
LEFT JOIN exterior ON exterior.id = cars.exteriorId AND exterior.language =parts.language
LEFT JOIN wheels ON wheels.id = cars.wheelId AND wheels.language =parts.language
LEFT JOIN extra ON extra.id = cars.extraId AND extra.language =parts.language
WHERE cars.id IN ('72727272') AND cars.source = 1

Поскольку вам требуется результат либо на английском, либо на английском, он будет проверять только на английском или немецком sh или немецком языковые результаты объединяются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...