2015-01-15 18 views
1

我已經寫了三個工作SQL語句,我試圖用一個工會這樣的:由於支架安置,mysql union聲明失敗?

(SELECT * FROM articles WHERE date <= '2015-01-15' AND category='News') 
UNION 
(SELECT * FROM articles WHERE date <= '2015-01-15' AND subcategory='News') 
ORDER BY date DESC LIMIT 5 
UNION 
SELECT * FROM articles WHERE Month(recurring) = '01' AND category='News' ORDER BY 
recurring DESC LIMIT 5 

的基本結構是什麼,我想諮詢一下:兩個初始查詢被聯合和按日期排序在一起。 然後第三個查詢,按單獨的列進行排序,然後合併到前兩個查詢中。

上面的查詢似乎工作正常,當我排序括號內的前2個查詢分開,但一旦我把它從括號中排序並將它們排序在一起失敗。

是由一個單獨的列排序,導致它失敗?我嘗試添加一組額外的括號來封裝前兩個語句以及排序順序,但沒有去。 以下是錯誤代碼:

您的SQL語法錯誤;檢查對應於您的MySQL服務器版本的手冊,以便在'UNION SELECT * FROM WHERE Month(recurring)='01'AND category ='News'at line 2附近使用正確的語法。

+0

您是否嘗試在原始'UNION'周圍添加括號,直到第二個? '((選擇......限制5)UNION' – Baldvin 2015-01-15 16:49:34

+0

是的,這是第一件事情之一。它確實將返回錯誤轉移到'在第1行',但相同的基本錯誤。 – user2067101 2015-01-15 17:04:03

回答

2

有幾個問題與您的查詢。 UNION查詢只能有一個LIMIT子句和一個ORDER BY子句,並且兩者都應用於整個結果。

如果我正確理解你的邏輯,我就重寫查詢,因爲這:

(
    SELECT * FROM articles 
    WHERE date <= '2015-01-15' AND (category='News' OR subcategory='News') 
    ORDER BY date DESC 
    LIMIT 5 
) 
UNION 
(
    SELECT * FROM articles 
    WHERE Month(recurring) = '01' AND category='News' 
    ORDER BY recurring DESC 
    LIMIT 5 
) 

如果您的查詢更復雜,你真的希望你的前兩個查詢要分開,這是正確的語法使用:

SELECT * FROM (
    SELECT * FROM articles WHERE date <= '2015-01-15' AND category='News' 
    UNION 
    SELECT * FROM articles WHERE date <= '2015-01-15' AND subcategory='News' 
    ORDER BY date DESC 
    LIMIT 5 
) AS s 
UNION 
(
    SELECT * FROM articles 
    WHERE Month(recurring) = '01' AND category='News' 
    ORDER BY recurring DESC 
    LIMIT 5 
)