【问题标题】:WHERE-IN or FIND_IN_SETWHERE-IN 或 FIND_IN_SET
【发布时间】:2012-08-08 10:16:55
【问题描述】:

一个未规范化的数据库有一个名为 batches 的表

表 batches 包含字段 student_ids,其中包含多个 id。例如1311, 1319, 1400

来自:从批次中选择 student_ids WHERE 1311 IN(student_ids)

我们得到 student_ids:1311, 1319, 1400

并且:从批次中选择 student_ids WHERE 1319 IN(1311, 1319, 1400)

工作正常:1311, 1319, 1400

但是

从批次 1319 IN(student_ids) 中选择 student_ids

从批次 b 中选择 @student_ids := student_ids; 从批次中选择 student_ids WHERE FIND_IN_SET(1319, @student_ids)

返回Null

我错过了什么?我想我必须将第一个结果转换为数组 - 但是如何?

我已经尝试过 Dash 的建议(非常感谢 Dash),但我仍然遇到问题

我也试过 选择编号 从批次 WHERE INSTR(','+1319+',', ','+CAST(student_ids AS CHAR) + ',')

正如 Matt Ellen 在另一篇文章中所建议的那样 - 仅在第一项匹配时才有效

【问题讨论】:

    标签: mysql where-in


    【解决方案1】:

    试试这个:

    SELECT @student_ids := GROUP_CONCAT(CAST(TRIM(student_ids) AS UNSIGNED INTEGER)) 
    FROM batches b; 
    
    SELECT student_ids 
    FROM batches 
    WHERE FIND_IN_SET(1311, @student_ids) ;
    

    SELECT student_ids FROM batches WHERE CAST(student_ids AS UNSIGNED INTEGER) IN (1319);
    

    【讨论】:

    • 哇,感谢您的即时回复。不幸的是,这只适用于第一个 id 1311 - 如果你尝试 1319,你会得到 null。
    • 尝试新查询。它应该像student_ids IN (1319) 尝试使用修剪。
    • 还没有:字段 student_ids 是 varchar ,有数据 '1311,1319,1400',但 IN 函数看不到第一项。
    • 如果是这样,那么您可能需要castintegerTRIM 它。
    猜你喜欢
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 2011-11-05
    • 2021-07-23
    • 2019-09-08
    • 1970-01-01
    相关资源
    最近更新 更多