2011-01-25 109 views
11
SELECT * FROM mm_tfs 
WHERE product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 
LIMIT 4 

返回4个值就像我问,但下面的语句返回0 - 是有关于使用或声明,我不熟悉的规则?我的假设是,它应该返回1中的所有值(或更多,如果它不是极限)。SQL LIMIT返回任何结果,其中没有限制返回结果

SELECT * FROM mm_tfs 
WHERE (product_slug LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21') 
OR (product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21') 
LIMIT 4 

注通过cyberkiwi第一或Q2的部分是完全一样的WHERE子句上Q1

product_description LIKE '%football%' AND schoolid = '8' AND category_id ='21 

不受本身或陈述确实产生,只要所希望的结果因为它没有限制。当OR语句与LIMIT一起使用时,返回0个值。

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 
LIMIT 4 

^- 产生0结果

SELECT * FROM mm_tfs 
WHERE product_description LIKE '%football%' 
    AND schoolid = '8' AND category_id ='21' 

^- 产生结果

这样做的奇怪的是,所有这些查询的产品在我PHPMYADMIN权效应SQL查询窗口,但不在应用程序本身中。

+0

看起来是一个布尔逻辑错误,而不是特定于OR。将整个东西包裹在大括号中,这是你(和)周围的整个条件。 – JonH 2011-01-25 19:33:09

+0

不,它返回值 – 2011-01-25 19:35:20

+1

这非常有趣。有人可以解释为什么它错了,而不是给予替代方法? +1 – Nishant 2011-01-25 19:42:27

回答

1

你重蹈这是没有必要的条件。试试这个:

SELECT * FROM mm_tfs 
WHERE 
    (product_slug LIKE '%football%' 
OR product_description LIKE '%football%') 
    AND schoolid = '8' 
    AND category_id ='21' 
LIMIT 4 

UPDATE:

我创建了如下表:

create table mm_tfs2 (schoolid varchar(2), categoryid varchar(2), 
         description varchar(20), slug varchar(20)); 

倍和5倍:

insert into mm_tfs2 values (8, 21, '', 'football'); 

最后查询:

select * from mm_tfs2 where 
(slug like '%football%' and schoolid = 8 and categoryid = 21) 
or (description like '%football%' and schoolid = 8 and categoryid = 21) 
limit 4; 
+----------+------------+-------------+----------+ 
| schoolid | categoryid | description | slug  | 
+----------+------------+-------------+----------+ 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
| 8  | 21   |    | football | 
+----------+------------+-------------+----------+ 
4 rows in set (0.00 sec) 

所以我很抱歉地说我无法重新创建问题。

1

试图把()约于整个条件

((...AND...) OR (...AND...)) 

像这样:

SELECT * FROM mm_tfs WHERE 
    ( (product_slug LIKE '%football%' AND schoolid = '8' AND category_id ='21') 
    OR (product_description LIKE '%football%' AND schoolid = '8' AND category_id 
    ='21') 
) LIMIT 4 
1

认为你可以清理一点点,你只能得到行的一所学校和一个类别ID,所以没有理由你应该有两次检查这些:

SELECT * 
FROM mm_tfs 
WHERE schoolid = '8' 
    AND category_id ='21' 
    AND (product_slug LIKE '%football%' 
     OR product_description LIKE '%football%') 
LIMIT 4;