【问题标题】:Using column value as clause for IN MySql使用列值作为 IN MySql 的子句
【发布时间】:2016-04-11 04:22:17
【问题描述】:

我不明白为什么这不起作用,我有一列在我的“Mysql”数据库中存储逗号分隔的值,然后我想加入两个表来给我结果。例如:

SELECT *
FROM users u INNER JOIN
     groups g
     ON u.id IN ( g.ownerId )
WHERE u.active='1' AND g.gid='15';  

g.ownerId 在这个senerio 中的值是'175,178'。

由于某种原因,这仅返回来自 ownerId 175 的联接的结果。但是,如果我在 IN 子句中手动输入值 ( 175, 178 ),则两行都会显示。为什么不使用 ownerId 列中的两个值?

我已经尝试过这个“分离”值或强制“列表”,但它没有工作...... SELECT * FROM users u INNER JOIN groups g ON u.id IN (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(g.ownerId, ',', 1), ' ', -1) as x, SUBSTRING_INDEX(SUBSTRING_INDEX(g.ownerId, ',', 2), ' ', -1) as y ) 其中 g.groupId='15'

有没有人经历过这种情况或知道该怎么做?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    它不起作用,因为in 值由一个列表组成,其中包含一个恰好有一个逗号的元素。相当于:

    on uid = '175,178'
    

    您可以将逻辑替换为find_in_set()

    on find_in_set(uid, g.id) > 0
    

    但是,您确实应该了解联结表以及为什么您的数据结构不好、不好、不好:

    • 您将数字存储为字符串。
    • 您有外键关系,但无法声明它们。
    • 您使用的字符串操作不当。
    • 您的查询无法使用索引。

    修复数据结构。

    【讨论】:

    • 我不确定他将数字存储为字符串。我多次看到该字段是数字的,但程序员使用引号,因为它会是一个字符串。
    • 是的,你击中了戈登的头,我试图避免使用“连接表”。但我现在明白了,出于你提出的原因,这是更好的方法。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2017-11-26
    • 2021-05-11
    • 1970-01-01
    • 2011-10-11
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多