我有三个桌子,
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
lagerevent
和mitglied
仅用于获取事件的名称和手套的名称...
只要在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中...
不知道如何解决-在那个阶段完全阻塞了大脑
答案 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;