SQL SELECT 结合 JOINS 和 CONTACTS 在一个选定字段中生成相同数据的多个条目

Posted

技术标签:

【中文标题】SQL SELECT 结合 JOINS 和 CONTACTS 在一个选定字段中生成相同数据的多个条目【英文标题】:SQL SELECT combined with JOINS and CONCATS produces multiplied entrys of the same data in one selected field 【发布时间】:2014-01-24 13:41:23 【问题描述】:

当前情况:

表格 fotos_images => 1 行数据

基本图像信息

表格fotos_keywords => 1行数据

一个关键字'Sonne'

表格 fotos_locations => 3 行数据

与“Berlin”一行,下一行“Treptow-Köpenick”,下一行“Deutschland”

表格 fotos_locations_images_idx => 3 行数据

'fotos_images'和'fotos_locations'的三对id组合

表格fotos_keywords_images_idx => 1行数据

'fotos_keywords' 和 'fotos_images' 的一对 id 组合

那里会有更多 - 数百甚至更多,现在它只是一个保存在数据库中的单个图像文件。图片将有 0 到 n 个位置和 0 到 n 个关键字。

我的查询是在一行中获取一张图像的所有数据,以便在程序的这一部分中进一步使用:

SELECT i.id
     , i.name
     , i.filename
     , i.iso
     , i.aperture
     , i.camera
     , i.exposure
     , i.copyright
     , i.timestamp
     , i.text
     , GROUP_CONCAT(k.keyword SEPARATOR ', ') keyword
     , GROUP_CONCAT(l.location SEPARATOR ', ') location 
  FROM fotos_images i
  LEFT 
  JOIN fotos_keywords_images_idx ki
    ON i.id = ki.id_image 
  LEFT 
  JOIN fotos_keywords k
    ON ki.id_keyword = k.id 
  LEFT 
  JOIN fotos_locations_images_idx  li
    ON i.id = li.id_image 
  LEFT 
  JOIN fotos_locations l
    ON li.id_location = l.id 
 GROUP 
    BY i.id
     , i.name
     , i.filename
     , i.iso
     , i.aperture
     , i.camera
     , i.exposure
     , i.copyright
     , i.timestamp
     , i.text;

我从查询中得到的信息:

id         197
name       Abendsonne   
filename   caa3005cce1791f3e27e8ce4cf11ee59.jpg 
iso        100  
aperture   f/5.6
camera     Canon EOS 60D
exposure   1/250
copyright  Hans Otto
timestamp  2014-01-07 01:08:02
text
keyword    Sonne, Sonne, Sonne
location   Berlin, Treptow-Köpenick, Deutschland

我期望(或想要)从查询中得到什么:

id         197
name       Abendsonne   
filename   caa3005cce1791f3e27e8ce4cf11ee59.jpg 
iso        100  
aperture   f/5.6
camera     Canon EOS 60D
exposure   1/250
copyright  Hans Otto
timestamp  2014-01-07 01:08:02
text
keyword    Sonne
location   Berlin, Treptow-Köpenick, Deutschland

查看“关键字”,因为这张图片只附加了一个关键字 - 其他的可能有更多或零。但是为什么它会成倍增加以及如何摆脱那个数学把戏呢?我知道这与地点有关,但我不知道如何解决这个难题。

非常感谢任何提示或解决方案!

【问题讨论】:

【参考方案1】:

如果您只是在k.keyword SEPARATOR ', ' 前面添加DISTINCT,它将正常工作:

...
, GROUP_CONCAT(DISTINCT k.keyword SEPARATOR ', ') keyword
...

【讨论】:

你是我的英雄 :D 谢谢!

以上是关于SQL SELECT 结合 JOINS 和 CONTACTS 在一个选定字段中生成相同数据的多个条目的主要内容,如果未能解决你的问题,请参考以下文章

SQL select -one to many joins 希望有很多

SAKILA 数据库 SQL 上的多个 JOINS

如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间

带有两个 INNER JOINS 的 SQL 查询抛出 HAVING COUNT

用于在不同表上具有多个 LEFT OUTER JOINS 的 SQL 的 LINQ

SQL SELF 和 INNER JOINS 在一个查询中