我的数据库中的状态字段具有此值
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
答案 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小提琴: -