2017-02-10 6 views
0

Вот мой снимок экрана, который показывает запрос, выполненный с помощью команды find_in_set.Выполнение find_in_set() в mysql

Выполняет набор значений только в определенной строке. Я хочу выполнить все значения в таблице, которые соответствуют команде find_in_set в одном запросе.

Посмотрите на мой код:

select * from shirts; 
+----+--------------+------------------------------------+ 
| id | colors  | days        | 
+----+--------------+------------------------------------+ 
| 1 | 1,2,5,12,15 | monday, friday, thursday   | 
| 2 | 1,5,12,15,30 | tuesday,monday      | 
| 3 | 2,5,11,15,28 | monday, friday,wednesday ,thursday | 
| 4 | 1,2,7,12,15 | tuesday,monday      | 
| 5 | 2,4,8,12,15 | tuesday,monday      | 
+----+--------------+------------------------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from shirts where find_in_set('5',colors) or find_in_set('30',colors) or find_in_set('30', colors) and find_in_set('monday',days) or find_in_set('tuesday',days); 
+----+--------------+------------------------------------+ 
| id | colors  | days        | 
+----+--------------+------------------------------------+ 
| 1 | 1,2,5,12,15 | monday, friday, thursday   | 
| 2 | 1,5,12,15,30 | tuesday,monday      | 
| 3 | 2,5,11,15,28 | monday, friday,wednesday ,thursday | 
| 4 | 1,2,7,12,15 | tuesday,monday      | 
| 5 | 2,4,8,12,15 | tuesday,monday      | 
+----+--------------+------------------------------------+ 
5 rows in set (0.00 sec) 

mysql> select * from shirts where find_in_set('5',colors) or find_in_set('30',colors) and find_in_set('monday',days) or find_in_set('tuesday',days); 
+----+--------------+------------------------------------+ 
| id | colors  | days        | 
+----+--------------+------------------------------------+ 
| 1 | 1,2,5,12,15 | monday, friday, thursday   | 
| 2 | 1,5,12,15,30 | tuesday,monday      | 
| 3 | 2,5,11,15,28 | monday, friday,wednesday ,thursday | 
| 4 | 1,2,7,12,15 | tuesday,monday      | 
| 5 | 2,4,8,12,15 | tuesday,monday      | 
+----+--------------+------------------------------------+ 
5 rows in set (0.00 sec) 

Я выбрал 5 и 30 в цветов и monday , friday в дней но он отображает только 1 и 3 строку.

Может ли кто-нибудь исправить мою проблему?

+5

где ваш скриншот? – fizzi

+0

улучшенное форматирование, фиксированная грамматика, добавленный тег –

ответ

0

Имейте в виду, что в булевой алгебре AND связывает более жесткие, чем OR.

Существует default order of precedence of these operators.

Когда вы пишете это:

select * from shirts where A or B and C or D 

Это всегда, как если бы вы использовали круглые скобки так:

select * from shirts where A or (B and C) or D 

Но вы хотите, чтобы действовать так:

select * from shirts where (A or B) and (C or D) 

Поэтому вам нужно будет написать запрос с явными скобками, чтобы переопределить порядок приоритета AND - OR.

Проблема не имеет ничего общего с использованием find_in_set(). Это просто ошибка булевой алгебры.

 Смежные вопросы

  • Нет связанных вопросов^_^