MySQL GROUP列,其中其他列条件与AND

时间:2018-08-01 12:17:48

标签: mysql database mysqli

我不是一个有说服力的人,但我认为以下示例将有助于显示我想要的内容:

当我执行此操作时:

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等等……这意味着我每次都必须自己加入。

1 个答案:

答案 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