MySql join每个类型返回三行,无论有多少行

时间:2011-08-09 15:04:18

标签: mysql join

我正在尝试连接我创建的这两个表,以便结果集为每种类型都有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      |
+--------------+-----------+

此处每个标签有三个条目,数据将替换为类型表

中的零

任何帮助都会很棒。

3 个答案:

答案 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;
  1. 为什么需要在“类型表”
  2. 中使用数据列
  3. 考虑类型表中的ID列和数据表中的TypeId

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

最后,如果只有一个虚拟行,我们添加了两个虚拟行,如果有两个虚拟行,我们只添加了一个虚拟行。你应该总是最终得到三个,就像你想要的那样。