2011-01-25 165 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;