2010-09-13 285 views
0

我需要一個正確的方法來編寫一個簡單的WHERE,AND,OR語句。這一個不工作:Mysql select語句

SELECT `content` 
    FROM `bx_wall_events` 
WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

回答

5

這是一個有效的陳述,但我想象的問題是ORs沒有像你期望的那樣被解釋。使用語法來代替:

SELECT content 
    FROM bx_wall_events 
    WHERE `type` IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
    AND `owner_id` = '{$iId}' 
ORDER BY `date` DESC 
    LIMIT 1 

我刪除了在特定的地點的反引號,因爲他們只爲逃避正在使用MySQL reserved keywords表&列名必需的。

的方式是:

WHERE `type` = 'wall_common_text' 
    OR `type` = 'wall_common_fb' 
    OR `type`= 'wall_common_tw' 
    AND `owner_id`='{$iId}' 

...正在評估是:

WHERE (`type` = 'wall_common_text') 
    OR (`type` = 'wall_common_fb') 
    OR (`type`= 'wall_common_tw' AND `owner_id`='{$iId}') 
+0

您也可以在ORs旁邊放置圓括號以將它們與AND分開,但我確實認爲這是要走到這裏的路。 – 2010-09-13 21:52:30

+0

@邁克爾馬德森:你可以,但「IN」更易於維護 - 錯過或放錯了一個括號,查詢可以是有效的,但不會返回正確的數據。在'IN'上錯過一個括號,並保證語法錯誤。 – 2010-09-13 21:55:00

0

「選擇content FROM bx_wall_events WHERE((type = 'wall_common_text')||(type = 'wall_common_fb')||(type = 'wall_common_tw')) AND owner_id ='{$ iId}'ORDER date DESC LIMIT 1「

+2

雙管是字符串連接的最佳解決方案。 .. – 2010-09-13 21:49:23

+0

在MySQL中,默認情況下,||是一個邏輯OR運算符。啓用PIPES_AS_CONCAT後,||是字符串連接(請參閱http://dev.mysql.com/doc/refman/5.1/en/operator-precedence.html) – 2010-09-13 21:54:41

+0

@martin clayton:不知道,但我確實知道如果啓用嚴格的SQL然後雙管道是字符串連接... – 2010-09-13 22:04:18

0

發現使用IN

在SQL
"SELECT `content` 
FROM `bx_wall_events` 
WHERE `owner_id`='{$iId}' 
AND `type` 
IN ('wall_common_text', 'wall_common_fb', 'wall_common_tw') 
ORDER BY `date` 
DESC LIMIT 1"