Оценка кратных чисел 'В' Выражениях, в 'ГДЕ' пункты в mysql

Запомните: 21 IQ ITEM 47

Его можно декодировать с любой телефонной панели, или вы можете просто записать его на бумаге.

Чтобы вспомнить «21 IQ ITEM 47», я бы сказал: «Hitman: Codename 47 имел 21 миссию, каждая из которых была IQ ITEM».

Или «Я чищу зубы каждый день в 21:47, потому что у меня высокий IQ и я не люблю предметы во рту».

8
задан Quassnoi 28 July 2009 в 14:41
поделиться

5 ответов

 ВЫБРАТЬ * ИЗ ИМЕНИ ТАБЛИЦЫ, ГДЕ b IN (5,7) И c IN (4,4)

Этот запрос вернет строки, где b равно 5 или 7 , И c равно 4 ].

Что вы подразумеваете под «оценкой в ​​парах?»

Обновление:

Я добавлю еще одну строку в образец:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     3    |     7    |     9    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
 |     5    |     2    |     9    |
 +----------+----------+----------+

Если вы хотите сопоставить все наборы, вы можете использовать этот синтаксис:

SELECT  *
FROM    table_name
WHERE   (b, c) IN ((2, 3), (7, 9))

Это означает: «вернуть все строки, где b равно 2 , а c равно 3 , одновременно, ИЛИ b равно 7 и с равно 9 одновременно. "

В приведенном выше примере этот запрос вернет rows 1 и 3

Но если вы переписываете этот запрос наоборот, например:

SELECT  *
FROM    table_name
WHERE   b IN (2, 7)
        AND c IN (3, 9)

, это будет означать "вернуть все строки, где b равно 2 или 7 , И c равно 3 или 9 ).

Это вернет строки 1 , 3 и 5 , поскольку строка 5 удовлетворяет условию для второй запрос, но не первый.

22
ответ дан 5 December 2019 в 05:08
поделиться

Строки 2 и 4 возвращаются правильно, хотя ваш выбор (4,4) может немного сбить с толку, поскольку он избыточен. И означает, что строка должна удовлетворять обоим вашим условиям, чтобы быть истинными. Если бы в запросе было WHERE b IN (5,7) AND c IN (4,9) , вы бы получили строки 2, 3 и 4.

Если вы думаете об этом попарно, вам нужно иметь все комбинации. например, b IN (5,7) AND c IN (4,9) даст (5,4), (5,9), (7,4) и (7,9) как возможные комбинации, которые будут работать, а НЕ только (5,4) и (7,9)

5
ответ дан 5 December 2019 в 05:08
поделиться

Вы можете оценить каждое условие по порядку, это может дать вам лучшее представление о том, что здесь происходит. В вашем запросе указано, что должны быть выбраны все значения, где b равно 5 или 7, а c равно 4, поэтому давайте уменьшим таблицу, используя первое условие ( b IN (5,7) ):

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     1    |     2    |     3    | < No match
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < Match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

Теперь, давайте оценим следующее условие, оба должны быть истинными, чтобы строка была выбрана ( c IN (4,4) , это по сути то же самое, что c = 4 ):

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    | < Match
 +----------+----------+----------+
 |     3    |     7    |     9    | < No match
 +----------+----------+----------+
 |     4    |     7    |     4    | < Match
 +----------+----------+----------+

Все остальное верно:

 +----------+----------+----------+
 |    PK    |     b    |     c    |
 +----------+----------+----------+
 |     2    |     5    |     4    |
 +----------+----------+----------+
 |     4    |     7    |     4    |
 +----------+----------+----------+
5
ответ дан 5 December 2019 в 05:08
поделиться

Да, я считаю, что вы правы.

Фактически, «IN» можно рассматривать как сокращение для (b = 5 OR b = 7). Это НЕ работает «под капотом», но это простой способ думать об этом.

Для больших таблиц использование нескольких предложений IN вызовет проблемы с производительностью.

РЕДАКТИРОВАТЬ:

Вышеупомянутое плакат правильный, c IN (4, 4) бессмысленно. С таким же успехом вы могли бы сказать «И c = 4».

Если вы преобразуете предложения в их логические эквиваленты, вы поймете, почему:

SELECT * FROM table ГДЕ (b = 5 OR b = 7) AND (c = 4 OR c = 4)

1
ответ дан 5 December 2019 в 05:08
поделиться

Ваш пример не совсем иллюстрирует ваш вопрос, но несколько предложений IN не связаны друг с другом; они вычисляются последовательно, как и любое другое предложение WHERE .

Таким образом, следующий запрос

SELECT * FROM FOO WHERE b IN(5,7) AND c IN(4,8)

будет соответствовать любому из следующего:

b  c
----
5  4
5  8
7  4
7  8

IN можно рассматривать как сокращение для сравнений с разделением или. Это означает, что предыдущий запрос также может быть записан как (механика немного отличается, но концепция та же):

SELECT * FROM FOO WHERE (b = 5 OR b = 7) AND (c = 4 OR c = 8)

Итак, в вашем примере да, возвращаются только строки 2 и 4. Но это не совсем так. по той причине, которую вы полагаете.

1
ответ дан 5 December 2019 в 05:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: