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

标签 mysql group-by left-join group-concat

手头的情况:

  • 表格 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

查看“关键词”,因为这张图片只附加了一个关键词——其他图片可能有更多或零个。但为什么它会相乘以及如何摆脱这个数学技巧呢?我知道它与位置有关,但我不知道如何解决这个难题。

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

最佳答案

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

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

关于mysql - SQL SELECT 结合 JOINS 和 CONTACTS 在一个选定字段中生成相同数据的多个条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20962054/

相关文章:

php - 从 PHP 检索 MYSQL 连接值

mysql - 如何获得连接的对立面?

mysql - 使用左连接时限制右表结果

mysql分区: double enum partitioning key

mysql - 比较不同列时获得最低值

php - SELECT - 拆分字段内容

python - Pandas groupby 丢弃列

mysql - 如何在 Windows IIS 服务器上安装 mysqli?

mysql - 谁能帮我找找2005年以前出版的书?

r - 改进group_by和summary的运行时间