【问题标题】:MySQL Combine Query and ignore duplicatesMySQL合并查询并忽略重复项
【发布时间】:2012-06-30 17:58:00
【问题描述】:

我有两个表 images2image_data

所以目标是为所有上传的图片(images2)创建一张表,然后 image_data 为该图片分配不同的选项。

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

所以 image_id 10 有不止一行,因为这个图像同时与 TN 和 CQ 相关联。而且它们还可以与一种以上的语言和幻灯片相关联,所以我会添加到第二行并更改 slide_id 或 language_id .. 如果想添加更多,我会为它添加一个新行。

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

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

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 有两行。

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

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

我不确定执行此操作的最佳方法.. 我是否需要重新执行我的数据库表的方式?任何帮助表示赞赏。

谢谢。

【问题讨论】:

  • “显示所有独特的图像,没有重复,所有选项都显示”是什么意思最好显示预期的输出
  • 我正在使用一个查询来显示所有图像并获取所有选项。因此,如果我的查询返回相同 photo_id 的多行,我的照片库将多次显示该图像。
  • 但你说我需要看看它也与 CQ 相关联——那么你到底想要什么?
  • 我不认为group_concat 会为您做这件事,因为在显示您的表单时,您可能需要每张幻灯片/语言/等的 ID。难道你不能只使用 PHP 来确保你不会两次显示同一张照片......然后在显示详细信息时你将拥有所有需要的信息?

标签: php mysql sql database database-design


【解决方案1】:

您可以使用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() 基于分隔符的字符串。

【讨论】:

  • 除了“TN,CQ”中的空格,因为默认分隔符是',',没有空格,所以只有“TN,CQ”
【解决方案2】:

您可以使用 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-21
    • 2016-03-21
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 2012-09-01
    • 2013-10-31
    相关资源
    最近更新 更多