2011-11-26 56 views
0

我無法弄清楚如何,因爲我limit輸出指望從我的查詢結果:與2 SELECTs,UNION和LIMIT的MySQL查詢 - 如何計算所有項目?

(SELECT "new" as type, name FROM newUsers WHERE name LIKE '%John%') 
UNION 
(SELECT "old" as type, name FROM oldUsers WHERE name LIKE '%John%') 
ORDER BY 1 ASC LIMIT 1, 10 

我最遠的是做SELECT COUNT(*) (my query) as userCount但我不明白的是輸出的所有其他領域我的查詢。

+0

你真的在做什麼? 「新約翰」行的數量及其細節數加上「舊約翰」行數及其細節的數量,但總共只需要10行?我認爲你把兩個不同的查詢混合得太徹底了;您可能需要運行兩個單獨的查詢 - 一個用於獲取兩個值(新的數字和舊的「John」條目的數量),另一個用於獲取有關舊約或新約翰行的最多10行信息。 –

+0

@Jonathan,你猜猜我想要什麼是正確的。我試圖獲得計數的原因是顯示必須經過以顯示所有項目的頁面數量(假設每頁有10個項目)。 – MarkL

回答

1

你彷彿被詢問這可能會回答的信信息,但是不是制定查詢的非常明智的方式:

SELECT c.numusers, n.type, n.name 
    FROM (SELECT "new" AS type, name FROM newUsers WHERE name LIKE '%John%') AS n 
    JOIN (SELECT COUNT(*) AS numusers FROM newUsers WHERE name LIKE '%John%') AS c 
UNION 
SELECT c.numusers, o.type, o.name 
    FROM (SELECT "old" AS type, name FROM oldUsers WHERE name LIKE '%John%') AS o 
    JOIN (SELECT COUNT(*) AS numusers FROM oldUsers WHERE name LIKE '%John%') AS c 
ORDER BY 1 ASC LIMIT 1, 10 

這裏唯一的奇怪之處在於兩個表之間沒有連接條件(既不是ON也不是USING子句)。您可能需要使用CROSS JOIN而不是(INNER)JOIN;或者,您可以將一列"new" AS type引入計數查詢,並加入ON n.type = c.type。然後,您可能需要添加一個GROUP BY子句 - 在大多數DBMS中,您將需要它,但是MySQL可能會讓您在沒有它的情況下離開。

不過,我想你會與兩個單獨的查詢做的更好 - 一個是類型和名稱,如你的問題,其他如:

SELECT COUNT(*) AS numusers, "new" AS type 
    FROM newUsers 
WHERE name LIKE '%John%' 
GROUP BY type 
UNION 
SELECT COUNT(*) AS numusers, "old" AS type 
    FROM oldUsers 
WHERE name LIKE '%John%' 
GROUP BY type; 

假設你正在使用MySQL,你可能會能夠在第二個查詢中沒有GROUP BY子句的情況下離開。

+0

謝謝。我想我試圖將事情過分複雜化,最好用兩個查詢。根據這種比較分析,它似乎也是一種更快的方法:http://bit.ly/zAP52 – MarkL

+0

結合這兩個查詢是[SQL反模式](http://pragprog.com/ book/bksqla/sql-antipatterns),特別是第18章「Spaghetti Query」。 –

2
(select SQL_CALC_FOUND_ROWS ...) 
union 
(select ...) // not using SQL_CALC_FOUND_ROWS here 
order by ... limit ...; 

第一個查詢得到的結果後,
可以查詢再次

select found_rows(); // to get all the rows count 

documentation