你好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
[
] [
] 3
答案 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