2017-02-10 48 views
0

这是我的屏幕截图,显示使用命令find_in_set执行的查询。在mysql中执行find_in_set()

它仅在特定行中执行一组值。我想在一个查询中执行与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) 

颜色monday , friday选用530但它仅显示13行。

任何人都可以纠正我的问题吗?

+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) 

因此,您必须使用明确的括号编写查询来覆盖的默认优先顺序与OR

该问题与使用find_in_set()无关。这只是一个布尔代数错误。