带有“where in"的嵌套 MySql Select 语句条款 [英] Nested MySql Select statement with "where in" clause
问题描述
我会尽量详细说明这一点.我有一个带有 where in 子句的嵌套 select 语句,但是应该将 select 的嵌套部分解释为文字字符串(我相信这是正确的术语).然而 mysql 的默认行为导致了我不想要的结果.
I'll try to detail this the best I can. I have a nested select statement with a where in clause, but the nested part of the select should be interpreted as a literal string (I believe this is the right terminology). However the default behavior of mysql leads to a result I do not want.
即
select class
from cs_item
where code="007"
+-------+
| class |
+-------+
| 1,3 |
+-------+
如果我在选择查询中明确键入in (1,3)",则以下是一个查询:
And the below is a query if I explicitly type "in (1,3)" as part of a select query:
select alpha,description
from cs_quality
where class in (1,3);
+-------+-------------+
| alpha | description |
+-------+-------------+
| STD | STD |
| XS | XS |
| 5 | Sch 5 |
| 10 | Sch 10 |
| 20 | Sch 20 |
| 40 | Sch 40 |
| 60 | Sch 60 |
| 80 | Sch 80 |
| 100 | Sch 100 |
| 120 | Sch 120 |
| 140 | Sch 140 |
| 160 | Sch 160 |
| XXS | XXS |
| 15L | 150# |
| 30L | 300# |
| 40L | 400# |
| 60L | 600# |
| 90L | 900# |
| 150L | 1500# |
| 200L | 2000# |
| 250L | 2500# |
| 300L | 3000# |
| 400L | 4000# |
| 600L | 6000# |
| 900L | 9000# |
+-------+-------------+
但是当我去嵌套它以获得与我相同的结果时......
But when I go to nest this to get the same result I have...
select alpha,description
from cs_quality
where class in (select class from cs_item where code = "007")
+-------+-------------+
| alpha | description |
+-------+-------------+
| STD | STD |
| XS | XS |
| 5 | Sch 5 |
| 10 | Sch 10 |
| 20 | Sch 20 |
| 40 | Sch 40 |
| 60 | Sch 60 |
| 80 | Sch 80 |
| 100 | Sch 100 |
| 120 | Sch 120 |
| 140 | Sch 140 |
| 160 | Sch 160 |
| XXS | XXS |
+-------+-------------+
这只是class in 1"的一部分……它对,3"组件犹豫不决.有没有办法将嵌套的选择解释为文字文本?
Which is just the part of "class in 1"... it balks on the ",3" component. Is there a way for the nested select to be interpreted as literal text?
谢谢大家,非常感谢.我在表述这个问题时遇到了一些麻烦,但会根据需要进行编辑.
Thanks all, much appreciated. I had a bit of trouble wording this question but will edit as needed.
推荐答案
规范化、规范化、规范化你的表,在本例中是表 cs_item
.您不应在一个字段中存储多个(逗号分隔)值.
Normalize, normalize, normalize your tables, in this case table cs_item
. You should NOT store multiple (comma separated) values in one field.
在你这样做之前,你可以使用:
Until you do that, you can use:
select alpha, description
from cs_quality
where FIND_IN_SET( class , (select class from cs_item where code = '007'))
或
select q.alpha, q.description
from cs_quality AS q
join cs_item AS i
on FIND_IN_SET( q.class , i.class )
where i.code = '007'
但是这种对 JOIN 使用特殊函数而不是相等的方法会导致查询速度非常慢.存储逗号分隔的列表会导致大量其他问题.看这里:
But this kind of using special functions instead of equality for JOINs, leads to very slow queries. Storing comma separated lists leads to a ton of other problems. See here:
简短的回答是:是的,很糟糕.
这篇关于带有“where in"的嵌套 MySql Select 语句条款的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!