2012-06-13 29 views
0

我想選擇條件爲true的行。我有一個名爲command的列,如果列值包含已定義的(由我)字符串,則添加到結果中。mysql - 爲什麼sql查詢選擇不必要的值?

我的問題是選擇行,因爲查詢沒有看到WHERE語句,所以如果列command包含字符串,它會選擇所有數據。

SELECT * 
FROM `admin_log` 
WHERE `admin_log`.`user` = 'Admin' 
    AND command LIKE '%aznot%' 
    OR command LIKE '%hango%' 
ORDER BY `order_id` DESC 
LIMIT 0, 50 

例如,我有3個管理員帳戶:Admin,Zuppa,Grund。如果命令列包含:aznot或hango,我希望通過帳戶ADMIN選擇所有數據。

我在做什麼錯?

+0

使用此查詢將返回到底是什麼。 –

+0

你得到了什麼樣的結果? –

回答

2

你需要一些括號。

SELECT * 
FROM `admin_log` 
WHERE `admin_log`.`user` = 'Admin' 
AND (command LIKE '%aznot%' OR command LIKE '%hango%') 
ORDER BY `order_id` 
DESC LIMIT 0, 50 
1
SELECT * FROM `admin_log` WHERE `admin_log`.`user` = 'Admin' 
AND (command LIKE '%aznot%' OR command LIKE '%hango%') 
ORDER BY `order_id` DESC LIMIT 0, 50 
1

嘗試是這樣的:

SELECT * FROM `admin_log` WHERE `admin_log`.`user` = 'Admin' AND (command LIKE '%aznot%' OR command LIKE '%hango%') ORDER BY `order_id` DESC LIMIT 0, 50 
1

這是更好的做法是分離或報表到一個單獨的表達,防止誤解發動機。

SELECT * FROM `admin_log` WHERE `admin_log`.`user` = 'Admin' AND (command LIKE '%aznot%' OR command LIKE '%hango%') ORDER BY `order_id` DESC LIMIT 0, 50 
1
SELECT * 
FROM `admin_log` 
WHERE `admin_log`.`user` = 'Admin' 
     AND (command LIKE '%aznot%' 
     OR command LIKE '%hango%') 
ORDER BY `order_id` DESC 
LIMIT 0, 50 
1

您需要正確巢的條件。請參閱SQL中邏輯運算符的優先級規則