Там, где нет равенства (SQL) - PullRequest
0 голосов
/ 16 апреля 2020

Я написал этот пункт:

WHERE ec.etudiant = po.utilisateurEtudiant

С этим у меня есть ученик, где это равенство. Теперь я хотел бы преобразовать этот запрос. Я хочу получить "Для каждого студента с идентификатором" e c .etudiant ", которого я не нахожу в" po.utilisateurEtudiant "... я делаю что-то. Как я могу получить это? Если возможно, избегайте LEFT JOIN ON : Я ищу решение в ГДЕ напрямую (по конкретной c причине, связанной с Symfony и моим кодом).

Спасибо за ваши ответы. 7,8,9 было примером. Я нужен настоящий динамический запрос c, который может сохранить только разницу между "po.utilisateurEtudiant" (содержит для ПРИМЕРА 7,8) и "e c .etudiant" (содержит 7,8,9, поэтому я хочу что мой запрос вернул мне ТОЛЬКО 9). И оставьте только часть "po.utilisateurEtudiant", которую "e c .etudiant" не содержит. Я пытался с NOT EXISTS в течение 1 часа, и я никогда не получаю то, что хочу: / Мой завершенный запрос (Symfony 4):

{
  return $em->createQuery(
    "SELECT u.nomUtilisateur, u.prenomUtilisateur, ec.id AS ec_id
    FROM App\Entity\CoursPlanning h
    INNER JOIN App\Entity\Cours c
    JOIN App\Entity\ProfCours p
    JOIN App\Entity\Utilisateur u
    JOIN App\Entity\CoursPlanning cp
    JOIN App\Entity\EtudiantCours ec
    JOIN App\Entity\PlageHoraire w
    JOIN App\Entity\DateCours d
    JOIN App\Entity\Formation f
    JOIN App\Entity\Pointage po
    WHERE u.roles = '[\"ROLE_USER\"]'
    AND cp.cours = '".$idCours."'
    AND cp.dateCours = '".$idDate."'
    AND po.cours = cp.id
    AND po.plageHoraire = cp.plageHoraire
    AND po.utilisateurEtudiant = u.id
    AND NOT EXISTS (SELECT 1 FROM App\Entity\EtudiantCours es
                    WHERE po.utilisateurEtudiant = es.etudiant )
    "
    )->getResult();
}

Этот запрос возвращает мне пустой результат. Но если я сделаю (в НЕ СУЩЕСТВУЮЩЕМ): "po.utilisateurEtudiant = 7", я получу 8. Или: если я сделаю "" po.utilisateurEtudiant = 8 ", я получу 7.

Спасибо Заранее!

1 Ответ

1 голос
/ 16 апреля 2020

Вы бы использовали not exists:

select ec.*
from ec
where not exists (select 1
                  from po
                  where ec.etudiant = po.utilisateurEtudiant
                 );
...