MySQL组合查询并忽略重复项

时间:2012-06-30 17:58:01

标签: php mysql sql database database-design

我有两张表 images2 image_data

enter image description here enter image description here

因此,目标是为所有图像上传(images2)设置1个表格,然后image_data将为该图像分配不同的选项。

例如,这里有一些示例数据:

enter image description here

因此image_id 10有多行,因为该图像与TN和CQ相关联。并且它们也可以与多种语言和幻灯片相关联,所以我会添加到第二行并更改slide_id或language_id ..如果想要添加更多,则为我添加新行。

目标是获得所有图像的列表,然后当您点击它时,它会弹出,您可以编辑选项并直接从那里进行更改。

enter image description here

我需要帮助编写查询。我现在拥有的那个:

SELECT images2.id, images2.filename, image_data.slide_id, image_data.language_id,
image_data.type FROM images2 
LEFT JOIN image_data ON images2.id = image_data.image_id

该查询出现了一些错误。它显示了重复项,因为image_id 10有两行。

enter image description here

但我需要第二行图像#10,因为我需要看到它也与CQ相关联,因此我可以在弹出时检查复选框。

因此,我需要创建一个查询,以显示所有唯一的图像,没有重复项,以及它具有的所有选项。

我不确定这样做的最好方法..我是否需要重新执行数据库表的方式?任何帮助表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用GROUP_CONCAT()将多行中的值转换为单个连接字符串。以下内容检索slideslanguages的ID以及它们的名称,以便更好地促进您的表单。

SELECT
    a.id,
    a.filename,
    GROUP_CONCAT(CONCAT(b.slide_id, '::', c.slide_name)) AS slides,
    GROUP_CONCAT(CONCAT(b.language_id, '::', d.language_name)) AS languages,
    GROUP_CONCAT(b.type) AS types,
FROM 
    images a
LEFT JOIN
    image_data b ON a.id = b.image_id
LEFT JOIN 
    slides c ON b.slide_id = c.id
LEFT JOIN
    languages d ON c.language_id = d.id
GROUP BY
    a.id

图片10的结果集如下所示:

id    |    image_filename    |    slides    |    languages    |    types
-------------------------------------------------------------------------
10    |    p170sfhe...       |    5::slide5 |    1::language1 |    TN,CQ

在php中,只需explode()基于分隔符的字符串。

答案 1 :(得分:1)

您可以使用GROUP_CONCAT获取字段的csv:

SELECT
  images2.id,
  images2.filename,
  GROUP_CONCAT(DISTINCT image_data.slide_id) AS slides,
  GROUP_CONCAT(DISTINCT image_data.language_id) AS langs,
  GROUP_CONCAT(DISTINCT image_data.type) AS types
FROM images2 
LEFT JOIN image_data ON (images2.id = image_data.image_id)
GROUP BY images2.id