如果表mgevent中没有status = 0,有没有办法捕获所有行?附有SELECT和TABLE

时间:2019-01-20 21:35:16

标签: mysql

我有三个桌子,

    lagerevent
    mgevent
    mitglied

lagerevent持有evid evname evdatvon evdatbis status

mgevent持有mgnr evid status

mitglied持有mgnr vname nname an

每个mgevent.evid可以有多个mgevent.mgnr,三个可能的mgevent.status是0、1和2。 每个mgevent.mgnr只能有一个mgevent.status和一个mgevent.evid

lagereventmitglied仅用于获取事件的名称和手套的名称...

只要在mgevent中都可以使用所有三个stati,以下SELECT数据集就可以完美工作,但不会捕获只有两个stati`mgevent.status'的事件

     SELECT 
         e1.evdatvon,
         e1.evdatbis,
         e1.evname,
         mg1.status,
         GROUP_CONCAT(DISTINCT mi1.vname
             ORDER BY mi1.vname
             SEPARATOR ', '),
         mg2.status,
         GROUP_CONCAT(DISTINCT mi2.vname
             ORDER BY mi2.vname
             SEPARATOR ', '),
         mg3.status,
         GROUP_CONCAT(DISTINCT mi3.vname
             ORDER BY mi3.vname
             SEPARATOR ', ')
     FROM
         lagerevent AS e1,
         mgevent AS mg1,
         mgevent AS mg2,
         mgevent AS mg3,
         mitglied AS mi1,
         mitglied AS mi2,
         mitglied AS mi3
     WHERE
         e1.status = 1 AND e1.evid = mg1.evid
             AND e1.evid = mg2.evid
             AND e1.evid = mg3.evid
             AND mg1.status = 0
             AND mg2.status = 1
             AND mg3.status = 2
             AND mg1.mgnr = mi1.mgnr
             AND mg2.mgnr = mi2.mgnr
             AND mg3.mgnr = mi3.mgnr
     GROUP BY mg1.evid , mg1.status
     ORDER BY e1.evid;`

lagerevent

     evid   evname                                              evdatvon    evdatbis    status  
     000001 Mittelaltermarkt Mendener Frühling und Heerlager    2019-05-04  2019-05-05  0   
     000002 Mittelaltermarkt Hagen blüht auf und Heerlager      2019-05-10  2019-05-12  1   
     000003 Historienspiele Festung Ehrenbreitstein 2019        2019-05-30  2019-06-02  1   
     000004 16. Broicher Pfingst Spektakulum Schloß Broich      2019-06-06  2019-06-10  1   
     000005 2. Schloss Walbecker Spektakel                      2019-07-18  2019-07-21  1   
     000006 Schaephuysen                                        2019-08-29  2019-09-01  1   
     000007 Ritterfest zu Gangelt 2019                          2019-09-04  2019-09-08  1

mgevent

     mgnr evid  status  
     001    000001  0   
     002    000001  0   
     003    000001  2   
     004    000001  0   
     005    000001  2   
     006    000001  2   
     007    000001  0   
     008    000001  2   
     009    000001  2   
     010    000001  0   
     011    000001  1   
     012    000001  0   
     013    000001  0   
     014    000001  0   
     015    000001  1   
     016    000001  1   
     017    000001  0   
     018    000001  0   
     019    000001  1   
     020    000001  0   
     021    000001  0   
     022    000001  1   
     023    000001  0   
     024    000001  0   
     001    000002  0   
     002    000002  1   
     003    000002  2   
     004    000002  2   
     005    000002  0   
     006    000002  2   
     007    000002  0   
     008    000002  2   
     009    000002  2   
     010    000002  0   
     011    000002  1   
     012    000002  1   
     013    000002  1   
     014    000002  1   
     015    000002  1   
     016    000002  1   
     017    000002  0   
     018    000002  1   
     019    000002  1   
     020    000002  0   
     021    000002  0   
     022    000002  1   
     023    000002  0   
     024    000002  1   
     001    000003  2   
     002    000003  1   
     003    000003  1   
     004    000003  2   
     005    000003  2   
     006    000003  1   
     007    000003  1   
     008    000003  1   
     009    000003  2   
     010    000003  1   
     011    000003  1   
     012    000003  1   
     013    000003  1   
     014    000003  1   
     015    000003  1   
     016    000003  1   
     017    000003  1   
     018    000003  1   
     019    000003  1   
     020    000003  1   
     021    000003  1   
     022    000003  1   
     023    000003  1   
     024    000003  1   
     001    000004  0   
     002    000004  0   
     003    000004  1   
     004    000004  2   
     005    000004  0   
     006    000004  1   
     007    000004  1   
     008    000004  1   
     009    000004  2   
     010    000004  1   
     011    000004  1   
     012    000004  1   
     013    000004  1   
     014    000004  1   
     015    000004  1   
     016    000004  1   
     017    000004  0   
     018    000004  1   
     019    000004  1   
     020    000004  1   
     021    000004  0   
     022    000004  1   
     023    000004  0   
     024    000004  1   
     001    000005  0   
     002    000005  0   
     003    000005  2   
     004    000005  2   
     005    000005  0   
     006    000005  2   
     007    000005  2   
     008    000005  2   
     009    000005  2   
     010    000005  1   
     011    000005  1   
     012    000005  1   
     013    000005  1   
     014    000005  1   
     015    000005  1   
     016    000005  1   
     017    000005  1   
     018    000005  1   
     019    000005  1   
     020    000005  0   
     021    000005  0   
     022    000005  1   
     023    000005  0   
     024    000005  1            
     001    000006  0   
     002    000006  0   
     003    000006  2   
     004    000006  2   
     005    000006  2   
     006    000006  2   
     007    000006  0   
     008    000006  2   
     009    000006  2   
     010    000006  1   
     011    000006  1   
     012    000006  1   
     013    000006  1   
     014    000006  1   
     015    000006  1   
     016    000006  1   
     017    000006  0   
     018    000006  1   
     019    000006  1   
     020    000006  0   
     021    000006  2   
     022    000006  1   
     023    000006  2   
     024    000006  1   
     001    000007  1   
     002    000007  0   
     003    000007  1   
     004    000007  1   
     005    000007  1   
     006    000007  1   
     007    000007  1   
     008    000007  1            
     009    000007  1   
     010    000007  1   
     011    000007  0   
     012    000007  1   
     013    000007  1   
     014    000007  1   
     015    000007  1   
     016    000007  1   
     017    000007  2   
     018    000007  1   
     019    000007  1   
     020    000007  1   
     021    000007  2   
     022    000007  1   
     023    000007  2   
     024    000007  1

迷住了

     mgnr vname         nname           an  
     001     Andre          Rebig           Herr    
     002     Anja           Klocke          Frau    
     003     Ann-Christin   Wystrach        Frau    
     004     Heike          Spiller         Frau    
     005     Marc           Hansen          Herr    
     006     Martina        Schilling       Frau    
     007     Nadine         Zilius          Frau    
     008     René           Blumenstein     Herr    
     009     Stefan         Hansen          Herr    
     010     Tamara         Pingel          Frau    
     011     Thorsten       Meier           Herr    
     012     Annalisa       Scheffel        Frau    
     013     Andreas        Enning          Herr    
     014     Anke           Enning-Neuhaus  Frau    
     015     Bianca         Boy             Frau    
     016     Christian      Borchert        Herr    
     017     Florian        Weißenberg      Herr    
     018     Inga           Aretz           Frau    
     019     Jens           Starick         Herr    
     020     Kati           Skrubel         Frau    
     021     Lisa           Roth            Frau    
     022     Markus         Kaut            Herr    
     023     Robert         Meyer           Herr    
     024     Sascha         Aretz           Herr

SELECT的输出:

     +------------+------------+-------------------------------------------------+--------+------------------------------------------------------------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------------------------------------------------------------------+
     | evdatvon   | evdatbis   | evname                                          | status | GROUP_CONCAT(DISTINCT mi1.vname ORDER BY mi1.vname SEPARATOR ', ')                 | status | GROUP_CONCAT(DISTINCT mi2.vname ORDER BY mi2.vname SEPARATOR ', ')                                                                                     | status | GROUP_CONCAT(DISTINCT mi3.vname ORDER BY mi3.vname SEPARATOR ', ')                 |
     +------------+------------+-------------------------------------------------+--------+------------------------------------------------------------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------------------------------------------------------------------+
     | 2019-05-10 | 2019-05-12 | Mittelaltermarkt Hagen blüht auf und Heerlager  |      0 | Andre, Florian, Kati, Lisa, Marc, Nadine, Robert, Tamara                           |      1 | Andreas, Anja, Anke, Annalisa, Bianca, Christian, Inga, Jens, Markus, Sascha, Thorsten                                                                 |      2 | Ann-Christin, Heike, Martina, René, Stefan                                         |
     | 2019-06-06 | 2019-06-10 | 16. Broicher Pfingst Spektakulum Schloß Broich  |      0 | Andre, Anja, Florian, Lisa, Marc, Robert                                           |      1 | Andreas, Anke, Ann-Christin, Annalisa, Bianca, Christian, Inga, Jens, Kati, Markus, Martina, Nadine, René, Sascha, Tamara, Thorsten                    |      2 | Heike, Stefan                                                                      |
     | 2019-07-18 | 2019-07-21 | 2. Schloss Walbecker Spektakel                  |      0 | Andre, Anja, Kati, Lisa, Marc, Robert                                              |      1 | Andreas, Anke, Annalisa, Bianca, Christian, Florian, Inga, Jens, Markus, Sascha, Tamara, Thorsten                                                      |      2 | Ann-Christin, Heike, Martina, Nadine, René, Stefan                                 |
     | 2019-08-29 | 2019-09-01 | Schaephuysen                                    |      0 | Andre, Anja, Florian, Kati, Nadine                                                 |      1 | Andreas, Anke, Annalisa, Bianca, Christian, Inga, Jens, Markus, Sascha, Tamara, Thorsten                                                               |      2 | Ann-Christin, Heike, Lisa, Marc, Martina, René, Robert, Stefan                     |
     | 2019-09-04 | 2019-09-08 | Ritterfest zu Gangelt 2019                      |      0 | Anja, Thorsten                                                                     |      1 | Andre, Andreas, Anke, Ann-Christin, Annalisa, Bianca, Christian, Heike, Inga, Jens, Kati, Marc, Markus, Martina, Nadine, René, Sascha, Stefan, Tamara  |      2 | Florian, Lisa, Robert                                                              |
     +------------+------------+-------------------------------------------------+--------+------------------------------------------------------------------------------------+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------+--------+------------------------------------------------------------------------------------+

您可以看到缺少一个事件,因为表mgevent中没有evid = 3的状态= 0。

我现在已经尝试了几天,所以我需要知道如何解决此问题,但是我认为我所掌握的知识不足...

我正在寻找类似的东西

IF (there is no mgevent.status = 0 OR no mgevent.status = 1 OR no mgevent.status = 2 write 'no one')

但在上面的SELECT中...

不知道如何解决-在那个阶段完全阻塞了大脑

1 个答案:

答案 0 :(得分:0)

您的查询有几个问题。

1)您正在使用带JOIN子句中条件的旧式隐式WHERE。这些需要更改为显式联接。然后,您可以将其中一些(或全部)切换到LEFT JOIN,以避免过滤掉无法完全联接的记录。

2)GROUP BY子句中的字段与SELECT中的非聚合字段不对应。仅在<= 5.7的MySQL上允许这样做,这不是一个好习惯。

这是您查询的新版本。我将所有联接都转到了LEFT JOIN上,您可能想适应一下。参见the db fiddle

SELECT 
     e1.evdatvon,
     e1.evdatbis,
     e1.evname,
     mg1.status,
     GROUP_CONCAT(DISTINCT mi1.vname ORDER BY mi1.vname SEPARATOR ', '),
     mg2.status,
     GROUP_CONCAT(DISTINCT mi2.vname ORDER BY mi2.vname SEPARATOR ', '),
     mg3.status,
     GROUP_CONCAT(DISTINCT mi3.vname ORDER BY mi3.vname SEPARATOR ', ')
 FROM
     lagerevent AS e1
     LEFT JOIN mgevent AS mg1  ON e1.evid = mg1.evid AND mg1.status = 0
     LEFT JOIN mgevent AS mg2  ON e1.evid = mg2.evid AND mg2.status = 1
     LEFT JOIN mgevent AS mg3  ON e1.evid = mg3.evid AND  mg3.status = 2
     LEFT JOIN mitglied AS mi1 ON mg1.mgnr = mi1.mgnr
     LEFT JOIN mitglied AS mi2 ON mg2.mgnr = mi2.mgnr
     LEFT JOIN mitglied AS mi3 ON mg3.mgnr = mi3.mgnr   
 WHERE 
     e1.status = 1
 GROUP BY 
     e1.evid,
     e1.evdatvon,
     e1.evdatbis,
     e1.evname,
     mg1.status,
     mg2.status,
     mg3.status
 ORDER BY 
     e1.evid;