Mysql Query не работает должным образом (с левыми соединениями) - PullRequest
0 голосов
/ 28 января 2019

Здравствуйте, mysql и sql эксперты

У меня проблема с моим запросом.

У меня 3 таблицы (как вы можете видеть на изображениях ниже)

Одна таблицадля события Одна таблица для учетной записи пользователя и одна таблица, с которой связаны таблица событий и таблица учетных записей пользователя (таблица Teilnehmer)

Когда пользователь регистрируется на событие, EventID, а также UserID будутхранится в таблице Teilnehmer.

Это прекрасно работает.

Теперь проблема в том, что я создал запрос, который должен возвращать только события, которые включены = 1, пользователь не сделал 't Зарегистрируйтесь, и счетчик FK_eventID равен

, но это не сработает.

Соединение Count и Enabled работает, но хотя пользователь подписывается на событие,событие все равно будет возвращено

Кто-нибудь может увидеть мою проблему?

SELECT v.ID, 
       v.NameVeranstaltung, 
       v.Datum, 
       v.Uhrzeit, 
       v.Anzahl, 
       v.Beschreibung, 
       v.Enabled, 
       Count(t.FK_eventID) 
FROM   Veranstaltung AS v 
       LEFT JOIN Teilnehmer AS t 
              ON t.FK_eventID = v.ID 
       LEFT JOIN Users AS u 
              ON t.FK_userID = 17 
WHERE  v.Enabled = 1 
GROUP  BY t.FK_eventID, 
          v.NameVeranstaltung 
HAVING Count(t.FK_eventID) < v.Anzahl 

enter image description here [enter image description here] [enter image description here] 3enter image description here

Ответы [ 5 ]

0 голосов
/ 31 января 2019

Возможно, я решил вашу проблему.

Я использовал подзапросы для вашей "проблемы"

Используйте этот код

SELECT 
          v.ID, v.NameVeranstaltung, v.Datum, v.Uhrzeit, v.Anzahl, v.Beschreibung, v.Enabled
          FROM
            Veranstaltung as v 
          WHERE 
            v.Enabled=1 and
            not exists
            (
              SELECT 1
              FROM Teilnehmer as t
              WHERE t.FK_eventID=v.ID and t.FK_userID = '$uid'
            )
            and v.Anzahl >
            (
              SELECT count(*)
              FROM Teilnehmer as t
              WHERE t.FK_eventID=v.ID
            );
0 голосов
/ 28 января 2019

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

FROM Veranstaltung v LEFT JOIN
     Teilnehmer t 
     ON t.FK_eventID = v.ID AND
        t.FK_userID = 17 

Я бы написал весь запрос как:

SELECT v.ID, v.NameVeranstaltung, v.Datum, v.Uhrzeit, 
       v.Anzahl, v.Beschreibung, v.Enabled, 
       Count(t.FK_eventID) 
FROM Veranstaltung v LEFT JOIN
     Teilnehmer t 
     ON t.FK_eventID = v.ID AND t.FK_userID = 17 
WHERE v.Enabled = 1 
GROUP BY v.ID, v.NameVeranstaltung, v.Datum, v.Uhrzeit, 
        v.Anzahl, v.Beschreibung, v.Enabled 
HAVING Count(t.FK_eventID) < v.Anzahl 
0 голосов
/ 28 января 2019

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

Вы пропускаете это условие в своем запросе

AND v.ID <> t.FK_eventID

Полный запрос должен быть,

    SELECT v.ID, 
       v.NameVeranstaltung, 
       v.Datum, 
       v.Uhrzeit, 
       v.Anzahl, 
       v.Beschreibung, 
       v.Enabled, 
       Count(t.FK_eventID) 
FROM   Veranstaltung AS v   
WHERE  v.Enabled = 1 AND v.ID NOT IN (
              SELECT t.FK_eventID 
              FROM Teilnehmer AS t LEFT JOIN Users AS u ON t.FK_userID = u.ID
              HAVING Count(t.FK_eventID) < v.Anzahl) 
GROUP  v.NameVeranstaltung

Вы не должны этого делать,

left join Users as u on t.FK_userID=17

Вместо этого позвольте JOIN произойти в чистом виде и определите ваши дополнительные критерии в предложении WHERE следующим образом:

left join Users as u on t.FK_userID=u.ID where v.Enabled=1 and u.ID = 17
0 голосов
/ 28 января 2019

Я бы рассмотрел коррелированный подзапрос вместо левых соединений:

SELECT v.ID, 
       v.NameVeranstaltung, 
       v.Datum, 
       v.Uhrzeit, 
       v.Anzahl, 
       v.Beschreibung, 
       v.Enabled, 
       (select Count(t.FK_eventID) from  Teilnehmer AS t where t.FK_eventID = v.ID) as t.FK_eventID 
FROM   Veranstaltung AS v 
WHERE  v.Enabled = 1 
HAVING t_FK_eventID < v.Anzahl 
0 голосов
/ 28 января 2019

Вы должны использовать OUTER JOIN, чтобы он включал в себя события, которые не имеют связанного пользователя справа, а затем добавлял условие, что user_id равен нулю.

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