MySQL逗号分隔字符串

时间:2014-07-10 12:23:28

标签: mysql

我的数据库中的状态字段具有此值

172:6,173:6,174:7

172,173, 174是我的ID,6,7我的状态在我的字符串中以:分隔。

现在我想在mysql中写下一个查询来获取状态为6,的id。我怎样才能使用我的字符串来获取id。

我的第一张表是具有字段

的教育详情表
id   lead_ref  status
1      R-1      172:6,173:6,174:7 

我的下一个表ID教育目标

id    target_course name
172      A
173      B
174      C

现在我想加入这两个表并获取状态为6的那些ID

2 个答案:

答案 0 :(得分:0)

你去了:

SELECT `status`
FROM `table`
WHERE `status` LIKE `%:6,%`  -- if there is a matching status before a comma
   OR `status` LIKE `%:6`;   -- if there is matching status as last item

MySQL中很难分割/爆炸字符串。见Can you split/explode a field in a MySQL query?

答案 1 :(得分:0)

这是可能的,但是这样做的方法更能说服您重新设计数据库,而不是在实时环境中使用它。

您可以通过将常量合并在一起来生成一系列数字。你将数字0到9联合起来并交叉连接,你可以生成数字0到99(和另一个交叉连接给你0到999等)。您可以将它与SUBSTRING_INDEX结合使用,以便根据逗号分割字符串。

因为这将提供重复项(以这种方式使用substring_index会将最后一个数据恢复到将其返回到最大数量所需的次数),然后您可以使用DISTINCT。

SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1)  = 6

如果您希望重复项返回正确的次数,则需要检查逗号分隔值的数量(将字段的长度与字段的长度进行比较,将所有逗号替换为空,以获取逗号的数量): -

SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) AS id
FROM some_table
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(some_field, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1)  = 6
AND (units.i + tens.i * 10) <= (LENGTH(some_field) - LENGTH(REPLACE(some_field, ',','')))

请注意,这两者仅处理最多100个逗号分隔值。很容易扩展它们以应对更多但这也会减慢查询速度。

编辑 - 获取您现在在上面发布的演示日期的状态的目标课程名称: -

SELECT education_details.id, education.target_course_name
FROM education_details
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) units
CROSS JOIN (SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) tens
INNER JOIN education ON SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', 1) = education.id
WHERE SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(status, ',', 1 + units.i + tens.i * 10), ',', -1), ':', -1)  = 6
AND (units.i + tens.i * 10) <= (LENGTH(status) - LENGTH(REPLACE(status, ',','')));

SQL小提琴: -

http://www.sqlfiddle.com/#!2/a2917/5