我正在尝试连接我创建的这两个表,以便结果集为每种类型都有3个条目。
数据表
mysql> SELECT * FROM data;
+--------------+-----------+
| Labels | Data |
+--------------+-----------+
| Component | 1325.1988 |
| Component | 554.1652 |
| Component | 105.4002 |
| Development | 203.4163 |
| Development | 59.4500 |
| Development | 20.4498 |
| Flash Assets | 285.5334 |
| Flash Assets | 302.1501 |
| Flash Assets | 61.1836 |
| Release | 0.6000 |
| Release | 2.3666 |
| Repackage | 416.2169 |
| Repackage | 5195.0839 |
| Repackage | 4.5667 |
| Source Diff | 1.9000 |
| Source Diff | 0.4000 |
+--------------+-----------+
类型表
mysql> SELECT * FROM types ORDER BY Labels;
+------------------------+------+
| Labels | Data |
+------------------------+------+
| Component | 0 |
| Component | 0 |
| Component | 0 |
| Development | 0 |
| Development | 0 |
| Development | 0 |
| Flash Assets | 0 |
| Flash Assets | 0 |
| Flash Assets | 0 |
| Release | 0 |
| Release | 0 |
| Release | 0 |
| Repackage | 0 |
| Repackage | 0 |
| Repackage | 0 |
| Source Diff | 0 |
| Source Diff | 0 |
| Source Diff | 0 |
+------------------------+------+
当前查询:
mysql> SELECT * FROM data d LEFT JOIN types t on t.Labels = d.Labels;
+--------------+-----------+--------------+------+
| Labels | Data | Labels | Data |
+--------------+-----------+--------------+------+
| Component | 1325.1988 | Component | 0 |
| Component | 1325.1988 | Component | 0 |
| Component | 1325.1988 | Component | 0 |
| Component | 554.1652 | Component | 0 |
| Component | 554.1652 | Component | 0 |
| Component | 554.1652 | Component | 0 |
| Component | 105.4002 | Component | 0 |
| Component | 105.4002 | Component | 0 |
| Component | 105.4002 | Component | 0 |
| Development | 203.4163 | Development | 0 |
| Development | 203.4163 | Development | 0 |
| Development | 203.4163 | Development | 0 |
| Development | 59.4500 | Development | 0 |
| Development | 59.4500 | Development | 0 |
| Development | 59.4500 | Development | 0 |
| Development | 20.4498 | Development | 0 |
| Development | 20.4498 | Development | 0 |
| Development | 20.4498 | Development | 0 |
| Flash Assets | 285.5334 | Flash Assets | 0 |
| Flash Assets | 285.5334 | Flash Assets | 0 |
| Flash Assets | 285.5334 | Flash Assets | 0 |
| Flash Assets | 302.1501 | Flash Assets | 0 |
| Flash Assets | 302.1501 | Flash Assets | 0 |
| Flash Assets | 302.1501 | Flash Assets | 0 |
| Flash Assets | 61.1836 | Flash Assets | 0 |
| Flash Assets | 61.1836 | Flash Assets | 0 |
| Flash Assets | 61.1836 | Flash Assets | 0 |
| Release | 0.6000 | Release | 0 |
| Release | 0.6000 | Release | 0 |
| Release | 0.6000 | Release | 0 |
| Release | 2.3666 | Release | 0 |
| Release | 2.3666 | Release | 0 |
| Release | 2.3666 | Release | 0 |
| Repackage | 416.2169 | Repackage | 0 |
| Repackage | 416.2169 | Repackage | 0 |
| Repackage | 416.2169 | Repackage | 0 |
| Repackage | 5195.0839 | Repackage | 0 |
| Repackage | 5195.0839 | Repackage | 0 |
| Repackage | 5195.0839 | Repackage | 0 |
| Repackage | 4.5667 | Repackage | 0 |
| Repackage | 4.5667 | Repackage | 0 |
| Repackage | 4.5667 | Repackage | 0 |
| Source Diff | 1.9000 | Source Diff | 0 |
| Source Diff | 1.9000 | Source Diff | 0 |
| Source Diff | 1.9000 | Source Diff | 0 |
| Source Diff | 0.4000 | Source Diff | 0 |
| Source Diff | 0.4000 | Source Diff | 0 |
| Source Diff | 0.4000 | Source Diff | 0 |
+--------------+-----------+--------------+------+
左连接的目标是获取Types
表中的所有标签,以便结果集中的每个标签都有三个条目。出于某种原因,它出来时髦。
期望的输出:
+--------------+-----------+
| Labels | Data |
+--------------+-----------+
| Component | 1325.1988 |
| Component | 554.1652 |
| Component | 105.4002 |
| Development | 203.4163 |
| Development | 59.4500 |
| Development | 20.4498 |
| Flash Assets | 285.5334 |
| Flash Assets | 302.1501 |
| Flash Assets | 61.1836 |
| Release | 0.6000 |
| Release | 0 |
| Release | 2.3666 |
| Repackage | 416.2169 |
| Repackage | 5195.0839 |
| Repackage | 4.5667 |
| Source Diff | 1.9000 |
| Source Diff | 1.9000 |
| Source Diff | 0 |
+--------------+-----------+
此处每个标签有三个条目,数据将替换为类型表
中的零任何帮助都会很棒。
答案 0 :(得分:0)
您的查询将每个标签加入到每个匹配的数据中,即类型中的3个组件中的每个组件到数据中的3个组件,从而产生9行。
您也可以执行以下操作 -
Select
t.Labels,
(select column1 from Data d where d.Label = t.Label),
(select column2 from Data d where d.Label = t.Label),
(select column3 from Data d where d.Label = t.Label)
from Types t
答案 1 :(得分:0)
您是否尝试过以下查询:
SELECT t.Labels, COALESCE(d.Data, 0)
FROM data d
LEFT JOIN types t on t.Labels = d.Labels;
答案 2 :(得分:0)
警告:如果您发现自己JOIN
在某些表中实际上不是唯一ID的内容,您可能想再次考虑它。
这是一个稍微优雅的解决方案,以确保每个标签有三行:
(SELECT d.Labels, d.Data
FROM Data d)
UNION ALL
(SELECT d.Labels, 0 AS Data
FROM Data d
GROUP BY d.Labels
HAVING Count(*) <= 2)
UNION ALL
(SELECT d.Labels, 0 AS Data
FROM Data d
GROUP BY d.Labels
HAVING Count(*) <= 1)
最后,如果只有一个虚拟行,我们添加了两个虚拟行,如果有两个虚拟行,我们只添加了一个虚拟行。你应该总是最终得到三个,就像你想要的那样。