【问题标题】:MySQL Group by value in comma separated column [duplicate]MySQL按逗号分隔列中的值分组[重复]
【发布时间】:2018-09-21 22:24:57
【问题描述】:

我可以对我正在尝试执行的数据库查询使用帮助。我有一个包含单词或短语、产品 ID、语言 ID 和版本 ID 的表格。 version_id 是一个逗号分隔的列,因为同一个词可以在多个版本中使用,我尽量避免添加具有相同数据的另一行,除了不同的版本。

表格目前看起来像这样

我正在尝试获取每个产品、版本和语言的字数。我遇到的问题是分隔 version_id,因为它是逗号分隔的列。有没有办法分别获取版本 1 和版本 2 中所有单词的计数?

我目前有这个查询,它可以工作,但它没有按逗号分隔列中的版本分隔。

SELECT COUNT( translation ) AS translations, fdp.name AS product, fdv.name AS version, fdl.name AS language, fdl.position 
FROM `fdnfortidictionary_dictionary` AS `fdd`  
LEFT JOIN `fdnfortidictionary_product` AS `fdp` ON fdd.product_id = fdp.id  
LEFT JOIN `fdnfortidictionary_version` AS `fdv` ON fdd.version_id = fdv.id  
LEFT JOIN `fdnfortidictionary_language` AS `fdl` ON fdd.language_id = fdl.id WHERE fdp.enable = 1 
  AND fdd.product_id IN (1,2) 
  AND CONCAT( ",", fdd.version_id, "," ) REGEXP ",(1|2|3|4|5)," 
GROUP BY `language`,`version`,`product`,`position` 
ORDER BY fdl.position ASC

我正在寻找的结果类似于,

【问题讨论】:

  • 最好的解决方案是首先不使用逗号分隔值。创建另一个表格,在单独的行中列出版本。
  • @Barmar 我有一张表格,列出了每个产品的版本。但是,如果新版本中出现相同的单词,这会不会导致冗余数据,还是无法避免?
  • 另一个表应该只有两列,一个指向该表 ID 的外键和版本号。没有多余的数据。
  • @Barmar 感谢您提醒我.. 应该进行标准化的下一步!

标签: mysql


【解决方案1】:

看来您可能对FIND_IN_SET() 有点运气 可能是FIND_IN_SET(fdd.version_id, fdl.version_id) > 0

【讨论】:

  • FIND_IN_SET 能否返回每个版本的字数?
  • 使用它代替您的 CONCAT REGEXP 连接条件,应该连接相应的记录。
  • 这只会产生 1 行,
猜你喜欢
  • 1970-01-01
  • 2013-10-26
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 2017-07-04
  • 1970-01-01
  • 2011-07-26
  • 2020-06-27
相关资源
最近更新 更多