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 希望有很多
如何在 SQL SERVER 中将内联 SQL 查询转换为 JOINS 以减少加载时间
带有两个 INNER JOINS 的 SQL 查询抛出 HAVING COUNT