我不是一个有说服力的人,但我认为以下示例将有助于显示我想要的内容:
当我执行此操作时:
SELECT schritt5_id,
liste_id
FROM schritt5
JOIN els_fehler_zo
ON els_fehler_zo.schritt5_id = schritt5.id
JOIN liste
ON liste.id = els_fehler_zo.liste_id
WHERE els_fehler_zo.liste_id = 1
OR els_fehler_zo.liste_id = 8
ORDER BY schritt5_id ASC;
我明白了:
schritt5_id | liste_id
3 1
3 8
6 8
11 8
15 8
25 1
28 1
420 1
421 8
422 1
422 8
423 1
423 8
426 8
438 1
现在,我想选择所有schritt5_id行,其中的liste_id为8 AND 1。 我试图保持简单,并使用AND更改了OR,但这是错误的。 现在,我将查询更改为:
SELECT schritt5_id,
liste_id,
GROUP_CONCAT(liste.id ORDER BY liste.id SEPARATOR ' | ') AS cellValue
FROM schritt5
JOIN els_fehler_zo
ON els_fehler_zo.schritt5_id = schritt5.id
JOIN liste
ON liste.id = els_fehler_zo.liste_id
WHERE els_fehler_zo.liste_id = 1
OR els_fehler_zo.liste_id = 8
GROUP BY schritt5_id
ORDER BY schritt5_id ASC;
结果是:
schritt5_id | liste_id | cellValue
3 1 1 | 8
6 8 8
11 8 8
15 8 8
25 1 1
28 1 1
420 1 1
421 8 8
422 1 1 | 8
423 1 1 | 8
426 8 8
438 1 1
我实际上想要得到的是:
schritt5_id | liste_id | cellValue
3 1 1 | 8
422 1 1 | 8
423 1 1 | 8
当我用自己的自我加入桌子时:
SELECT *
FROM els_fehler_zo
JOIN els_fehler_zo a
ON a.schritt5_id = els_fehler_zo.schritt5_id
AND a.liste_id != els_fehler_zo.liste_id
WHERE a.liste_id = 1
AND els_fehler_zo.liste_id = 8
OR els_fehler_zo.liste_id = 8
AND a.liste_id = 1
GROUP BY a.schritt5_id;
还有另一种方法可以完成此操作,而无需将表自身与其连接。因为,如果我想搜索liste_id 8 AND 1 AND 2 AND 3 ans等等……这意味着我每次都必须自己加入。
答案 0 :(得分:1)
我们可以使用HAVING
子句。 HAVING
子句用于限制GROUP BY
子句返回的结果。在WHERE
之前应用GROUP BY
,在HAVING
之后应用HAVING COUNT(*) >= 2
(并且可以对聚合进行过滤)。
SELECT schritt5_id,
liste_id,
GROUP_CONCAT(liste.id ORDER BY liste.id SEPARATOR ' | ') AS cellValue
FROM schritt5
JOIN els_fehler_zo
ON els_fehler_zo.schritt5_id = schritt5.id
JOIN liste
ON liste.id = els_fehler_zo.liste_id
WHERE els_fehler_zo.liste_id = 1
OR els_fehler_zo.liste_id = 8
GROUP BY schritt5_id
HAVING COUNT(*) >= 2
ORDER BY schritt5_id ASC;
将返回计数大于等于2的行。
moment().subtract(1, 'weeks').startOf('isoWeek')
moment().subtract(1, 'weeks').endOf('isoWeek')
一个小提琴样本:http://sqlfiddle.com/#!9/5d857/3