2011-04-22 38 views
2

由於某種原因,這個查詢不會產生正確的結果,任何人都可以看到我是否犯了一個簡單的錯誤。如果最壞的情況變得更糟,我會把它分成兩個查詢,並使用我的應用程序引擎合併結果,但這是緩慢和骯髒的,我很想保持這是一個查詢。MySQL混合AND's和OR's,括號不起作用

SELECT * 
FROM `chat_messages` 
WHERE 
(
(`from` = :me AND `to` = :them AND `from_clear` = FALSE) OR 
(`from` = :them AND `to` = :me AND `to_clear` = FALSE) 
) 
ORDER BY `time` ASC; 

這是我的表:

CREATE TABLE `chat_messages` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT, 
    `from` varchar(16) NOT NULL, 
    `to` varchar(16) NOT NULL, 
    `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `message` text NOT NULL, 
    `read` tinyint(1) NOT NULL DEFAULT '0', 
    `from_clear` tinyint(1) NOT NULL DEFAULT '0', 
    `to_clear` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `from` (`from`), 
    KEY `to` (`to`), 
    KEY `time` (`time`), 
    KEY `read` (`read`), 
    KEY `from_clear` (`from_clear`), 
    KEY `to_clear` (`to_clear`) 
) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=latin1; 

任何幫助將非常感激。

+0

你到底要與上面的查詢做什麼? – 2011-04-22 14:51:49

+0

首先你不需要'WHERE'後面的第一個paranthese和最後一個,'ORDER BY'前面。其次,它的意思是:「不會產生正確的結果」?你能詳細說明嗎? – 2011-04-22 14:53:40

+0

爲了幫助你,你應該讓我們知道你期待的結果,以及你實際得到的結果。看起來查詢會用'from_clear'錯誤的方式向我們發送消息,或者使用'to_clear'錯誤向我發送消息給我。那實際上是你想要做什麼?什麼不起作用? – 2011-04-22 15:46:15

回答

0

不知道錯誤,你不能在這裏真正得到正確的答案。但正如其中一條評論所指出的,你的綁定方法可能是原因。這是一個瘋狂的猜測,但它可能是你沒有正確地綁定,或者沒有足夠的價值?

嘗試硬編碼您的語句中的值。我敢打賭它是有效的,然後你可以處理綁定問題。有時你必須有兩個變量,而不是一個被命名兩次,但這取決於。換句話說,你可能必須嘗試:

(`from` = :me_1 AND `to` = :them_1 AND `from_clear` = FALSE) OR 
(`from` = :them_2 AND `to` = :me_2 AND `to_clear` = FALSE) 
+0

我正在使用PDO庫進行綁定。我試圖做的是獲得兩個用戶之間還沒有被清除的所有消息。 sql沒有正確地返回消息列表,當一個人清除他們的列表時,它會搞砸他們的兩個列表。 MJB解決方案起作用,它必須是多重綁定的問題。 – mrkmg 2011-04-22 18:25:48