【问题标题】:mysql in list only validates first id in list. maybe a blob issue [duplicate]列表中的 mysql 仅验证列表中的第一个 id。也许是一个blob问题[重复]
【发布时间】:2011-03-28 10:12:13
【问题描述】:

我使用的系统使用逗号分隔值作为一对多关系。它以 blob 形式存储。

我尝试使用 MySQL IN (LIST),但仅以 uid 在列表中第一个或列表中只有一个的行结束。

mytable
uid categories
1   24,25,26
2   25
3   22,23,25
4   25,27

run sql:
SELECT * FROM mytable WHERE 25 IN (categories)

Result:
uid categories
2   25
4   25,27

Missing (should have been selected but are not)
uid categories
1   24,25,26
3   22,23,25

知道为什么一个字符串必须以 25 开头,而不仅仅是 25 吗?我猜这是字符串问题而不是 IN (LIST) 问题

更新 - 基于以下答案:

在 blob 上使用 th IN (LIST) 时,该 blob 将转换为 int 并且逗号和“数字”会丢失。

改为使用 FIND_IN_SET(needle, haystack),它也适用于包含逗号分隔值的 blob。

【问题讨论】:

    标签: mysql list select


    【解决方案1】:

    我想你在找FIND_IN_SET

     SELECT * FROM mytable WHERE FIND_IN_SET(25,category)
    

    【讨论】:

    • 在这种情况下根本没有任何意义。
    • something IN (25)something = 25 做同样的事情
    • -1 列名在IN 中是完全可以接受的,您甚至可以使用多个列名。问题是一列不会被评估为 OP 想要的多个值。
    • @Shakti,没关系,现在...看来我的投票已被锁定,但没有其他编辑...:P
    • 测试和工作。即使在 BLOB 上。完美!
    【解决方案2】:

    这应该会给你你的答案:

    SELECT * FROM mytable WHERE CONCAT(',', categories, ',') LIKE '%,25,%'
    

    但是创建一个连接表会更有意义,每个逗号分隔值作为一个新行。

    【讨论】:

    • 还将“找到”一个带有“225”的字段。
    • -1 除非有 id 125...
    • @jswolf19 你应该在-1之前等我反应过来。谢谢!
    • @vbence,如果您以可接受的方式进行编辑,那么我将删除 -1,但这似乎是在发布之前应该考虑的一个考虑因素。试想一下,如果 OP 在示例数据中寻找 id 2。
    • @jswolf19 那么您对当前的解决方案有何看法?
    【解决方案3】:

    发生的事情是 MySQL 将 blob 转换为整数(不是整数列表)以进行比较。所以 '24,25,26' 变成了值 24。你可以通过运行查询来确认这一点

    SELECT CAST(categories AS signed) FROM mytable
    

    这不是IN(也不是 blob 数据类型)的使用方式。您是否有理由不为此使用另一个表?

    【讨论】:

    • 抱歉,这不是答案。
    • @vbence,我想我确实回答了这个问题,“知道为什么字符串必须以 25 开头,而不仅仅是包含 25 吗?”
    • 谢谢。这正是发生的事情。 blob 被视为整数。我现在可以看到了。现在我需要弄清楚如何将其转换为 CHAR (尝试过但没有运气),这样我就可以在字符串上执行 IN 了。我很确定 IN 是为此而生的。但显然,blob 不是。
    • 哦,忘了你的最后一个问题。我在一个框架上工作,该框架经常使用一对多关系作为存储为 blob 的逗号分隔字符串。在我使用 php 选择它们并在另一个查询中作为 IN (LIST) 重用它们之前。没问题。这是我第一次尝试在单个查询中执行此操作,显然 FIND_IN_SET 是正确的选择。
    • @Tillebeck,不幸的是,IN 不适用于您使用的特定方法。当您使用两个查询时,您将字符串插入到查询中,导致它被解释为多个值,但对于单个查询,使用列名只会被解释为单个值。因此,FIND_IN_SET 可能是您的情况的最佳选择,尽管如果您的 one-2-many 中的 many 确实很多,那么另一个表很可能会更有效(尽管这可能不是您可以做出的设计决策)。
    【解决方案4】:

    是的,这是字符串问题。您的“列表”只是 mysql 的一个字符串,没有任何意义。

    您必须使用RegEx

    但您可能会考虑改为规范化您的表格。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-23
      相关资源
      最近更新 更多