【问题标题】:With Mysql - Problem with left join three tables getting duplicated group_concat results使用 Mysql - 左连接三个表的问题得到重复的 group_concat 结果
【发布时间】:2021-08-17 03:00:42
【问题描述】:

我有以下表格,我想通过 left join 和 group_contact 加入

可维护

+--------+---------+
| cedula | nombre  |
+--------+---------+
| 002    | Eduardo |
| Hola   | Carlos  |
+--------+---------+

maintable_msel_sex1

+--------+------+--------------------------------------+
| cedula | sex1 | rowuuid                              |
+--------+------+--------------------------------------+
| 002    |    1 | 4ccc2b41-e72a-4d55-b167-17a41c18b29b |
| 002    |    2 | 89323daa-4ad4-4b43-9ecc-22d4fdd8fef1 |
| Hola   |    1 | 9e7b4da0-2a93-4c82-80eb-3172bb163536 |
+--------+------+--------------------------------------+

maintable_msel_sex2

+--------+------+--------------------------------------+
| cedula | sex2 | rowuuid                              |
+--------+------+--------------------------------------+
| 002    |    2 | 122123d3-aa5e-42b5-8ddd-0e5d700bd92c |
| 002    |    1 | 462c8138-37b1-42bd-a0c8-4a63d9e67dda |
| Hola   |    1 | 8d96c9c8-4633-4425-8f27-59591bee8954 |
| Hola   |    2 | bbe42e16-fc9d-4e1d-825d-1eb59161f2fb |
+--------+------+--------------------------------------+

maintable_msel_crops

+--------+-------+--------------------------------------+
| cedula | crops | rowuuid                              |
+--------+-------+--------------------------------------+
| 002    |     3 | 404e7f5c-fb07-4d43-85a8-6c86c5407546 |
| Hola   |     3 | 423d1d06-9be4-4d47-a5be-8407db4c258b |
| 002    |     4 | 6d27aa7f-b6d2-426b-9c05-c20f88d97d7b |
| 002    |     1 | 7673127b-72ed-45fd-8688-8f6942abeaa0 |
| Hola   |     1 | 80f84fbe-ad47-4178-8577-eaa82562abaa |
+--------+-------+--------------------------------------+

我尝试使用以下选择加入他们:

SELECT maintable.cedula,GROUP_CONCAT(maintable_msel_sex1.sex1) as sex1, GROUP_CONCAT(maintable_msel_sex2.sex2) as sex2, GROUP_CONCAT(maintable_msel_crops.crops) as crops
FROM maintable 
LEFT JOIN maintable_msel_sex1 ON maintable.cedula = maintable_msel_sex1.cedula
LEFT JOIN maintable_msel_sex2 ON maintable.cedula = maintable_msel_sex2.cedula
LEFT JOIN maintable_msel_crops ON maintable.cedula = maintable_msel_crops.cedula
GROUP BY  maintable.cedula;

但我明白了:

+--------+-------------------------+-------------------------+-------------------------+
| cedula | sex1                    | sex2                    | crops                   |
+--------+-------------------------+-------------------------+-------------------------+
| 002    | 1,1,1,1,1,1,2,2,2,2,2,2 | 1,1,1,2,2,2,1,1,1,2,2,2 | 1,3,4,1,3,4,1,3,4,1,3,4 |
| Hola   | 1,1,1,1                 | 1,1,2,2                 | 1,3,1,3                 |
+--------+-------------------------+-------------------------+-------------------------+

我想得到:

+--------+-------------------------+-------------------------+-------------------------+
| cedula | sex1                    | sex2                    | crops                   |
+--------+-------------------------+-------------------------+-------------------------+
| 002    | 1,2                     | 1,2                     | 1,3,4                   |
| Hola   | 1                       | 1,2                     | 1,3                     |
+--------+-------------------------+-------------------------+-------------------------+

我尝试使用 INNER JOIN 和 RIGHT JOIN 并仅使用一个 JOIN 与 () 中的多个表,但我只是没有得到这样的结果。

我可以在 group_concat 中使用 distinct 作为补丁,但我不明白为什么会得到重复的结果。

感谢任何帮助

【问题讨论】:

  • 我看不出 1f2fb 比 bbe42e16-fc9d-4e1d-825d-1eb59161f2fb 对普通观察者来说更难理解,但也许这就是我。无论如何,如需进一步帮助,请参阅 meta.stackoverflow.com/questions/333952/…
  • “我可以在 group_concat 中使用 distinct 作为补丁,但我不明白为什么会得到重复的结果。” - 你的 group_concating 是每个 maintable 每个 maintable_msel_sex1 每个 maintable_msel_sex2 每个 maintable_msel_crops 一行。因此,如果您有 1 个 maintable 行,其中包含 2 个 sex1 行和 2 个 sex2 行以及 3 个 crop 行,那是您组合在一起的 12 个不同的行组合(002/1/1/1、002/1/1/3、002/ 1/1/4、002/1/2/1、002/1/2/3、002/1/2/4、002/2/1/1、002/2/1/3、002/2/ 1/4, 002/2/2/1, 002/2/2/3, 002/2/2/4)。

标签: mysql sql join


【解决方案1】:

如果我正确理解您的问题,您希望每个值在 GROUP_CONCAT 中只包含一次。为此,您可以使用DISTINCT:

SELECT
  maintable.cedula,
  GROUP_CONCAT(DISTINCT maintable_msel_sex1.sex1) as sex1,
  GROUP_CONCAT(DISTINCT maintable_msel_sex2.sex2) as sex2,
  GROUP_CONCAT(DISTINCT maintable_msel_crops.crops) as crops
FROM maintable 
  LEFT JOIN maintable_msel_sex1 ON maintable.cedula = maintable_msel_sex1.cedula
  LEFT JOIN maintable_msel_sex2 ON maintable.cedula = maintable_msel_sex2.cedula
  LEFT JOIN maintable_msel_crops ON maintable.cedula = maintable_msel_crops.cedula
GROUP BY  maintable.cedula;

请参阅MySQL DISTINCT on a GROUP_CONCAT()http://dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_group-concat 了解更多信息

【讨论】:

    猜你喜欢
    • 2021-03-22
    • 2013-08-25
    • 2014-02-04
    • 2016-12-21
    • 2011-06-30
    • 2018-09-04
    • 1970-01-01
    • 2012-08-13
    相关资源
    最近更新 更多