MySQL 查询联结表返回重复行

Posted

技术标签:

【中文标题】MySQL 查询联结表返回重复行【英文标题】:MySQL querying a junction table returns duplicate rows 【发布时间】:2017-08-17 09:16:56 【问题描述】:

我有以下表结构:

所以一个产品可能有多个product_type

当我在 mysql 中加入时,每个 product_type 都会重复出现 product 记录。因此,例如,如果我有一个名为 Actifoam 的产品,并且它在 products_types 表中有 2 条记录,那么查询的结果将包括两次 Actifoam(每个都有不同的 product_type

这是我的查询:

SELECT DISTINCT product.*, product_type.name as product_type_name
FROM products_types
JOIN product_type ON product_type.id = products_types.product_type_id
JOIN product ON product.id = products_types.product_id

查询结果如下:

[
    0 => [
        'id' => 'recccAQHxsb4OEsX6'
        'name' => 'Actifoam'
        'product_type_name' => 'Silver Dressing'
    ]
    1 => [
        'id' => 'recccAQHxsb4OEsX6'
        'name' => 'Actifoam'
        'product_type_name' => 'Foam'
    ]
]

我不希望 product 记录像这样出现多次,如果有多个 product_types,我希望所有内容都出现在一行上。

有人知道我如何实现这一目标吗?

【问题讨论】:

【参考方案1】:

DISTINCT 仅当 SELECT 语句中的所有列的 2 行具有完全相同的对应值时才会返回唯一行。在您的情况下,您需要 GROUP BYGROUP_CONCAT

GROUP_CONCAT 将返回product_type_name,以逗号分隔。

SELECT product.*, GROUP_CONCAT(product_type.name) as product_type_name
FROM products_types
JOIN product_type ON product_type.id = products_types.product_type_id
JOIN product ON product.id = products_types.product_id
GROUP BY product.id

【讨论】:

以上是关于MySQL 查询联结表返回重复行的主要内容,如果未能解决你的问题,请参考以下文章

仅对 MYSQL 中最后返回的行执行 JOIN [重复]

MySQL查询有效地返回不包括重复信息的组合行

在MySQL中获取准确的重复行

MySQL - 查询除第一行之外的所有行[重复]

返回行中的mysql Max(date)值[重复]

MySQL - 使用另一个表中的列排序行并且不重复数据