【问题标题】:Intersect values on Mysql comma separated valuesMysql逗号分隔值上的相交值
【发布时间】:2021-10-13 21:40:11
【问题描述】:

我有一个表PriceList,它有一个VARCHARtags,我在其中存储了一个逗号分隔的值列表。 价目表的一个例子是:

ID name tags
1 Price list 1 tag1,tag2
2 Price list 2 tag3,tag4

我现在想要的是通过标签列表(逗号分隔值)查询此表。如果查询中存在所有标签,则应选择 priceList。 我在查询中传递的标签可能比 PriceList 的标签列中定义的标签更多。

例如:

SELECT * FROM PriceList WHERE 'tag2,tag1,tag7' IN/FIND_IN_SET??? (tags)

在此示例中,我希望检索 PriceList ID1,因为它的 所有标签都包含在 'tag2,tag1,tag7' 值中。

我没有在 Mysql 中找到任何有用的功能来完成我需要做的事情。我知道这不是最好的设计,这是可以接受的,因为 PriceList 表真的很小(5/10 项)。

我想到的唯一想法是存储按字母顺序排序的标签,并查看 PriceList 的标签列是否是我的标签列表的子字符串。 你怎么看?你有什么提示吗?

【问题讨论】:

  • 在为时已晚之前修复您的规范化。那么这将是一个微不足道的查询
  • @Randy 我明白你的意思,我同意你的观点,但为了完整起见,我想看看这个问题是否有解决方案。
  • 你使用的是什么 MySQL 版本?
  • @FaNo_FN 我正在使用 RDS Aurora 2.10 (Mysq 5.7)

标签: mysql


【解决方案1】:

尝试以下操作,它将 PriceList 中的标签拆分为多行,并根据输入标签列表计算匹配的行

SELECT a.ID, MAX(a.tags), MAX(a.name)
FROM (
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(p.tags, ',', comma_index), ',', -1) AS tag, p.ID, LENGTH(p.tags) - LENGTH(REPLACE(p.tags, ',', '')) + 1 AS counts, p.tags, p.name
    FROM (
        SELECT 1 AS comma_index
        UNION ALL 
        SELECT 2
        UNION ALL 
        SELECT 3
        UNION ALL 
        SELECT 4
        UNION ALL 
        SELECT 5
    )  a
    JOIN PriceList p
    WHERE a.comma_index <= LENGTH(p.tags) - LENGTH(REPLACE(p.tags, ',', '')) + 1
) a 
WHERE FIND_IN_SET(a.tag, 'tag2,tag1,tag7')
GROUP BY a.ID
HAVING COUNT(*) = MAX(a.counts)

UNION部分是一个例子,请确保运行数字大于表中的最大标签数。

http://sqlfiddle.com/#!9/eb379d/1

但请确保在单个标签仍在使用时连接标签不是一个好的设计,请考虑单独存储标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-25
    • 2018-12-08
    相关资源
    最近更新 更多