Вложенный оператор MySql Select с предложением «где в» - PullRequest
0 голосов
/ 12 июля 2011

Я постараюсь описать это как можно лучше У меня есть вложенный оператор выбора с предложением where in, но вложенная часть выбора должна интерпретироваться как буквенная строка (я считаю, что это правильная терминология). Однако поведение mysql по умолчанию приводит к результату, который я не хочу.

* 1003 Т.е. *

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". Есть ли способ для вложенного выбора быть интерпретированным как буквальный текст?

Спасибо всем, высоко ценится. У меня была небольшая проблема с формулировкой этого вопроса, но я буду редактировать по мере необходимости.

Ответы [ 3 ]

8 голосов
/ 12 июля 2011

Нормализуйте, нормализуйте, нормализуйте ваши таблицы, в данном случае таблицу 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 приводит к очень медленным запросам. Хранение разделенных запятыми списков приводит к множеству других проблем. Смотрите здесь:

Короткий ответ: Да, это так плохо .

5 голосов
/ 12 июля 2011

Ваш запрос должен возвращать несколько строк, например:

+-------+
| class |
+-------+
|   1   |
+-------+
|   3   |
+-------+

В противном случае вы делаете следующее:

select alpha,description 
from cs_quality 
where class in ("1, 3");

Что вам не нужно.

0 голосов
/ 12 июля 2011

Лучше использовать join вместо вложенного запроса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...