我会尽力详细说明这一点。我有一个带有where子句的嵌套select语句,但是select的嵌套部分应该被解释为文字字符串(我相信这是正确的术语)。但是mysql的默认行为导致了我不想要的结果。
即
select class
from cs_item
where code="007"
+-------+
| class |
+-------+
| 1,3 |
+-------+
如果我在选择查询中明确键入“in(1,3)”,则以下是查询:
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# |
+-------+-------------+
但是当我去筑巢时,我得到的结果相同......
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 |
+-------+-------------+
这只是“1级”的一部分......它在“,3”组件上徘徊。有没有办法将嵌套选择解释为文字文本?
谢谢大家,非常感谢。我在编写这个问题时遇到了一些麻烦,但会根据需要进行编辑。
答案 0 :(得分:8)
规范化,规范化,规范化表格,在本例中为表格cs_item
。您不应在一个字段中存储多个(逗号分隔)值。
在您这样做之前,您可以使用:
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的相等性会导致查询速度非常慢。存储逗号分隔的列表会导致大量其他问题。见这里:
简短回答是:是的,这很糟糕。
答案 1 :(得分:5)
您的查询需要返回多行,如下所示:
+-------+
| class |
+-------+
| 1 |
+-------+
| 3 |
+-------+
或者就像你在做的那样:
select alpha,description
from cs_quality
where class in ("1, 3");
你不想要的。
答案 2 :(得分:0)
更好地使用join
,而不是嵌套查询