SQL-запрос.Отдайте все пиды с sys_language_uid = 1 и без sys_language_uid = 2 - PullRequest
0 голосов
/ 04 декабря 2018

Я тренируюсь с TYPO3, и я хочу построить запрос на переводы.

Мне нужны все пиды, которые имеют sys_language_uid=1, но не перевод sys_language_uid=2

Как мне построитьэто с SQL?

SELECT pids FROM pages_language_overlay 
WHERE sys_language_uid=1 
AND (where sys_language_uid=2 doesnt exist)

THX

Ответы [ 3 ]

0 голосов
/ 04 декабря 2018

Другое - использовать не существует

(обычно самый быстрый)

SELECT pids 
FROM pages_language_overlay PLO 
WHERE sys_language_uid = 1 
  and not exists (SELECT 1 
                  FROM pages_language_overlay PLO2
                  WHERE PLO2.sys_language_uid = 2 
                    and PLO.pids = PLO2.pids)

при условии, что PIDS является PK.

Или используя левое соединение ... когда в uid не найдено совпадение пидов 2 Не постится, но предлагает больше опций для данных.

SELECT PLO.pids 
FROM pages_language_overlay PLO 
LEFT JOIN pages_language_overlay PLO2
  on PLO.PIDS = PLO2.PIDS
 and PLO2.sys_language_uid = 2
WHERE sys_language_uid = 1 
 and PLO2.PIDS is null
0 голосов
/ 04 декабря 2018

Еще один вариант левого соединения, но для него требуется ноль

select
      PLO.pids
   from
      pages_language_overlay PLO
         LEFT JOIN pages_language_overlay PLO2
            on PLO.pids = PLO2.pids
            AND PLO2.sys_language_uid = 2
   where
          PLO.sys_language_uid = 1
      AND PLO2.sys_language_uid IS NULL
0 голосов
/ 04 декабря 2018

Один из вариантов здесь - использовать агрегацию:

SELECT pids
FROM pages_language_overlay
GROUP BY pids
HAVING
    COUNT(CASE WHEN sys_language_uid = 1 THEN 1 END) > 0 AND
    COUNT(CASE WHEN sys_language_uid = 2 THEN 1 END) = 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...