场景 - 具有参赛者类别的帆船赛事。
我是一名志愿者,我正在努力为每个参赛者获得一个结果表,列出他们对每个类别的选择(如果没有选择,则为 NULL)。请帮我!
参赛者 2097 为所有 3 个类别设置了值,
参赛者 2099 只有两个类别(没有选择船员)
但我需要一行为船员设置 NULL 值。
我需要的输出行如下所示
(即必须包括带有 ecnName = 'Crew'、ecyEntry='2099' 和 eciValue = 'NULL' 的最后一行)
而我的查询不这样做!
+---------+----------+----------+
| ecnName | eciValue | ecyEntry |
+---------+----------+----------+
| Fleet | Gold | 2097 |
| Helm | Male | 2097 |
| Crew | Male | 2097 |
| Fleet | Silver | 2099 |
| Helm | Male | 2099 |
| Crew | NULL | 2099 |
+---------+----------+----------+
我尝试了 LEFT/RIGHT 连接的各种组合,
但没有得到答案,所以非常感谢任何指导!
我的查询在下面,以及源表。
我当前的查询:
[racescoring]>
SELECT *
FROM `tblcategories`
JOIN `tblcategoryitems`
ON eciCategory = ecnID
LEFT JOIN tblentrycategories
ON ecyItem = eciID
WHERE ecnEvent = 57
ORDER BY ecyEntry, ecyItem;
给出的结果包括根本没有参赛者选择的行,并且对于参赛者 2099 Crew 来说不是空的,所以不是我需要的!
+-------+----------+----------+---------+-------+-------------+----------+----------+---------+
| ecnID | ecnEvent | ecnOrder | ecnName | eciID | eciCategory | eciValue | ecyEntry | ecyItem |
+-------+----------+----------+---------+-------+-------------+----------+----------+---------+
| 32 | 57 | 3 | Crew | 61 | 32 | Female | NULL | NULL |
| 31 | 57 | 2 | Helm | 59 | 31 | Female | NULL | NULL |
| 29 | 57 | 1 | Fleet | 55 | 29 | Bronze | NULL | NULL |
| 29 | 57 | 1 | Fleet | 53 | 29 | Gold | 2097 | 53 |
| 31 | 57 | 2 | Helm | 58 | 31 | Male | 2097 | 58 |
| 32 | 57 | 3 | Crew | 60 | 32 | Male | 2097 | 60 |
| 29 | 57 | 1 | Fleet | 54 | 29 | Silver | 2099 | 54 |
| 31 | 57 | 2 | Helm | 58 | 31 | Male | 2099 | 58 |
+-------+----------+----------+---------+-------+-------------+----------+----------+---------+
此特定事件 id=57 有 3 个类别。
[racescoring]> SELECT * FROM tblcategories;
+-------+----------+----------+---------+
| ecnID | ecnEvent | ecnOrder | ecnName |
+-------+----------+----------+---------+
| 29 | 57 | 1 | Fleet |
| 31 | 57 | 2 | Helm |
| 32 | 57 | 3 | Crew |
+-------+----------+----------+---------+
每个类别在此表中都有可能的项目值
[racescoring]> SELECT * FROM tblcategoryitems;
+-------+-------------+----------+
| eciID | eciCategory | eciValue |
+-------+-------------+----------+
| 55 | 29 | Bronze |
| 53 | 29 | Gold |
| 54 | 29 | Silver |
| 59 | 31 | Female |
| 58 | 31 | Male |
| 61 | 32 | Female |
| 60 | 32 | Male |
+-------+-------------+----------+
仅针对两名水手使用条目类别进行测试。
[racescoring]> SELECT * FROM tblentrycategories;
+----------+---------+
| ecyEntry | ecyItem |
+----------+---------+
| 2097 | 53 |
| 2097 | 58 |
| 2097 | 60 |
| 2099 | 54 |
| 2099 | 58 |
+----------+---------+
要删除不需要的列,您应该列出需要的列:
每本有关 SQL 的教科书中都描述了
select *
和之间的区别。select a,b,c
您的数据并未真正针对您的比赛在现实生活中的运作方式进行正确建模。
特别是可选的 Crew 逻辑。
但是,如果我们真的通过以奇怪的方式加入和分组来破解数据,您可以获得您要求的“正确”输出。
唯一的问题是我没有 MySQL,所以这是 Microsoft SQL 中的解决方案:
我根据您的反馈修改了这个答案。我还注意到您已经发布了自己的答案。为了未来访客的利益,我留下这个答案。
MySQL 可能在将限制应用于事件 57 之前应用了 LEFT JOIN。在这种情况下,如果有问题的水手在其他某个事件中输入,并且该事件指定了船员,您将看到您得到的错误答案.
您的查询的以下返工旨在强制 MySQL 在执行左连接之前将项目限制为事件 57。我不懂 MySQL,所以这里可能有语法错误。
如果这对其他人有帮助,我最终使用 UNION 语句获得了结果。
第一部分选择最后一行的“缺失”项目:
2099 | 3 | Crew | |
。第二部分选择所有具有确实存在的值的行。
还有一些列别名来对齐两个部分。
查询结果: