2010-09-17 24 views
0

我試圖運行此查詢:括號在這個mysql結果中影響嗎?

(
    (SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?)) 

    UNION 

    (SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?)) 
) 
LIMIT 5 

,但得到一個錯誤,因爲周圍的括號,就LIMIT 5之前。 obs: the query is all in a row, i endented it here for better reading. is it allowed in sql?

以下工作正常:

(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?)) 

UNION 

(SELECT * FROM (SELECT * FROM `users` WHERE `access_level` > 0) AS `search_subject` WHERE (BINARY `username` = ?)) 

LIMIT 5 

我的問題是:這第二個版本是相當於第一個或者處於第二個版本的限制僅適用於在第二SELECT?如果是這樣,我能做些什麼來解決這個問題?謝謝(:

ps: don't worry about the interrogation marks. that's just because of the prepared statements

回答

2

其實,你不需要括號:

SELECT * 
    FROM `users` 
WHERE `access_level` > 0 
    AND BINARY `username` = ? 
UNION 
SELECT * 
FROM `users` 
WHERE `access_level` > 0 
    AND BINARY `username` = ? 
LIMIT 5 

有一個在聯盟開始的兩邊沒有差別,所以沒有必要爲它。

否,該限制適用於所有的UNION'd查詢的結果一樣,ORDER BY子句。

+0

如果我在每個選擇中使用ORDER BY,該怎麼辦?我只是在這裏試過,沒有錯誤...... – 2010-09-17 02:06:24

+0

@hugo_leonardo:只要它在括號內,MySQL中就支持每個UNION中的ORDER BY(和LIMIT),包含構成UNION一部分的查詢。我不知道其他dbs是否允許這樣做。 – 2010-09-17 02:08:05

+0

好吧。謝謝^^ – 2010-09-17 02:13:32

1

我假定這是樣本曲因爲你的陳述不僅是多餘的,而且形成不良。

但是,要回答您的原始問題,添加圓括號會創建一個表達式來更改操作的順序。就像在數學中一樣。所以第一個例子中表達式的結果不支持LIMIT子句。然而,第二個,與UNION聲明一樣。

長話短說,括號使其成爲一個不同的聲明,並使LIMIT無效。你不需要它們。這很微妙,但這就是問題所在。

+0

是的,它是一個示例查詢:p – 2010-09-17 02:02:59

+0

我想通了。正確;; – 2010-09-17 02:03:50

+0

允許獨立ORDER BY和LIMIT在UNION上的括號不是操作順序 – 2010-09-17 02:10:23

相關問題