2011-06-01 141 views
1

我知道這個SQL查詢是錯誤的,或者我錯過了一些東西,但我有一個充滿消息的表。我想獲得所有消息,其中用戶ID是ether 1或2,而reply_to是0.但是用我的SQL查詢,它顯示了答覆,並且現在不是用戶2的帖子。SQL查詢不想工作

這是我的SQL

SELECT * 
FROM `msg` 
WHERE 
    `userid` LIKE '1' 
    OR 
    `user_id` LIKE '2' AND `reply_to` LIKE '0' 
ORDER BY `timestamp` DESC 
LIMIT 0,10; 

如何修復我的查詢以完成我想要的操作?

+3

對於精確匹配,使用'='而不是'LIKE'。 – 2011-06-01 11:09:11

+0

也是「1」而不是「1」,而「OR」的優先級低於「AND」的事實。我格式化了您的查詢,以顯示它實際嘗試執行的操作。 – GSerg 2011-06-01 11:11:00

回答

4

這個怎麼樣?:

SELECT * FROM `msg` 
    WHERE `userid` in ('1','2') AND `reply_to`='0' 
    ORDER BY `timestamp` DESC LIMIT 0,10; 
+0

請注意你的報價! – 2011-06-01 11:10:52

+0

@Jon:對不起,我沒有得到你。哪些引號? – 2011-06-01 11:13:27

+0

哇。這工作!我會盡可能地接受它。 @Harry Joy,在你編輯之前,你有一個失蹤的' – Colum 2011-06-01 11:14:08

1

TRY

SELECT * FROM `msg` 
     WHERE `userid` IN (1,2) AND `reply_to`='0' 
     ORDER BY `timestamp` 
     DESC LIMIT 0,10; 
0

在我看來,如果你需要括號添加到您的WHERE條款,以確保ORAND部分的執行順序是你想要的方式。

0

嘗試:

SELECT * 
FROM `msg` 
WHERE (`userid` = '1' OR `user_id` = '2') 
AND `reply_to` = '0' 
ORDER BY `timestamp` DESC LIMIT 0,10; 

的括號是重要的一點。當您不搜索通配符時,應該使用=而不是Like

您也可以使用in作爲user_id檢查。

0

你需要使用括號(我假設這些工作在mysql中,就像他們在mssql中那樣)來幫助它知道where子句的哪些條件是可接受的。

SELECT *FROM `msg` 
WHERE (`userid` LIKE '1' 
OR `user_id` LIKE '2') 
AND `reply_to` LIKE '0' 
ORDER BY `timestamp` 
DESCLIMIT 0,10; 
0

取決於你在你的條件實際上是經過了什麼,你要麼需要:

SELECT * FROM `msg` 
WHERE (`userid` IN ('1','2')) 
    AND (`reply_to` = '0') 
ORDER BY `timestamp` DESC 
LIMIT 0, 10; 

...或:

SELECT * FROM `msg` 
WHERE (`userid` = '1') 
    OR (
     (`userid` = '2') 
    AND (`reply_to` = '0') 
    ) 
ORDER BY `timestamp` DESC 
LIMIT 0, 10; 
3

您有說,一個條件:

user=1 or user=2 and reply_to=0 

如果這被評估爲像(user=1 or user=2) and reply_to=0然後你會得到你想要的結果,無回答的消息,其中用戶是user1或user2。但是,如果評估類似user=1 or (user=2 and reply_to=0)將返回所有用戶1的消息,並且返回user2的未回覆消息,所以存在一些不明確之處。

我的建議是:從來沒有,我的意思是永遠,混合的and,並在同等條件下的or。當然,有優先規則,它會告訴你,p or q and r是以某種方式評估的,但它們在不同的平臺,不同的語言,甚至不同的實現中可能會有所不同。想象一下,如果不是3,那麼有15個條件?

始終使用圓括號來分隔和/或阻止。編譯器或數據庫不關心或不需要它們,但是當我們可以設想計算機實際指示要做什麼時,人類的思想就會更好地工作。

你可以重寫查詢,如:

SELECT * FROM msg 
    WHERE (userid=1 OR user_id=2) 
    AND reply_to = 0 
ORDER BY timestamp DESC 

那裏的條件之間的關係更爲明顯。

P.S.如果您實際上沒有使用LIKE通配符,請避免使用LIKE

+0

+1之前的錯誤,未給出替代解決方案 – SinistraD 2011-06-02 00:48:51