嵌套的MySql Select语句带有"where in"子句

jpa*_*ich 0 mysql sql

我会尽力详细说明这一点.我有一个带有where子句的嵌套select语句,但是select的嵌套部分应该被解释为文字字符串(我相信这是正确的术语).但是mysql的默认行为导致了我不想要的结果.

select class 
from cs_item 
where code="007"

+-------+
| class |
+-------+
| 1,3   |
+-------+
Run Code Online (Sandbox Code Playgroud)

如果我明确键入"in(1,3)"作为select查询的一部分,则下面是一个查询:

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#       |
+-------+-------------+
Run Code Online (Sandbox Code Playgroud)

但是当我去筑巢时,我得到了相同的结果......

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         |
+-------+-------------+
Run Code Online (Sandbox Code Playgroud)

这只是"1级"的一部分......它在",3"组件上徘徊.有没有办法将嵌套选择解释为文字文本?

谢谢大家,非常感谢.我在处理这个问题时遇到了一些麻烦,但会根据需要进行编辑.

ype*_*eᵀᴹ 8

规范化,规范化,规范化表格,在本例中为表格cs_item.您不应在一个字段中存储多个(逗号分隔)值.

在你这样做之前,你可以使用:

select alpha, description 
from cs_quality 
where FIND_IN_SET( class , (select class from cs_item where code = '007'))
Run Code Online (Sandbox Code Playgroud)

要么

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'
Run Code Online (Sandbox Code Playgroud)

但是这种使用特殊函数而不是JOIN的相等性会导致查询速度非常慢.存储逗号分隔的列表会导致大量其他问题.看这里:

简短的回答是:是的,这很糟糕.


Nea*_*eal 5

您的查询需要返回多行,如下所示:

+-------+
| class |
+-------+
|   1   |
+-------+
|   3   |
+-------+
Run Code Online (Sandbox Code Playgroud)

或者就好像你在做:

select alpha,description 
from cs_quality 
where class in ("1, 3");
Run Code Online (Sandbox Code Playgroud)

你不想要的.