Mysql Query不能按预期工作(带有左联接)

时间:2019-01-28 14:13:26

标签: mysql sql

你好mysql和sql专家

我的查询有问题。

我有3张桌子(如下图所示)

该活动的一张桌子 用户帐户一张表 事件表和用户帐户表链接到的一个表(Teilnehmer表)

当用户注册事件时,EventID和UserID将存储在Teilnehmer表中。

那很好。

现在的问题是,我创建了一个查询,该查询仅应返回Enabled = 1,用户未注册且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 
       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] 3 enter image description here

5 个答案:

答案 0 :(得分:1)

我可以解决您的问题。

我为您的“问题”使用了子查询

使用此代码

 InputFilter [] phoneFilter = new InputFilter[]{new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (end > start ){
            String resultingTxt = dest.toString().substring(0, dstart) + source.subSequence(start, end) + dest.toString().substring(dend);
            if (resultingTxt.length() == 2)
                return source.subSequence(start, end) + "-";
        }

        return null;
    }
}};
editText.setFilters(phoneFilter);

答案 1 :(得分:0)

您应该使用OUTER JOIN,以便它包括右侧没有关联用户的事件,然后添加user_id为null的条件。

答案 2 :(得分:0)

您必须添加条件,以赋予我所有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

答案 3 :(得分:0)

我会考虑使用关联的子查询,而不要使用LEFT JOIN:

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 

答案 4 :(得分:0)

从查询中可以看出,您无需引用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