2012-01-14 28 views
1

我想一種方法來使用一個查詢與子查詢,而不是使用兩個單獨的查詢。如何限制子查詢請求到一個?

但是結果表明使用子查詢會對結果集中的每一行導致多個請求。有沒有辦法限制這個計數子查詢結果只有一個在組合查詢中?

SELECT `ad_general`.`id`, 
    (SELECT count(`ad_general`.`id`) AS count 
     FROM (`ad_general`) 
     WHERE `city` = 708) AS count, 
    FROM (`ad_general`) 
    WHERE `ad_general`.`city` = '708' 
    ORDER BY `ad_general`.`id` DESC 
    LIMIT 15 

可能是使用連接可以解決問題,但不知道如何?

+0

爲什麼708在查詢的一部分中引號,而不是在另一部分引號中?是ad_general.city一個字符串還是整數? – 2012-01-14 08:31:41

+0

整數,但我不認爲沒有任何由引號引起的顯着差異。 – motto 2012-01-14 08:36:58

+1

請注意,您可以[將行格式化爲代碼](http://meta.stackexchange.com/questions/22186/)縮進四個空格。編輯器工具欄中的「{}」按鈕可以爲您做到這一點。大於('>')用於從某處引用文本塊。單擊編輯器工具欄中的橙色問號以獲取更多信息和格式化提示。 – outis 2012-01-14 10:24:28

回答

1
SELECT ad_general.id, stats.cnt 
FROM ad_general 
    JOIN (
     SELECT count(*) as cnt 
     FROM ad_general 
     WHERE city = 708 
    ) AS stats 
WHERE ad_general.city = 708 
ORDER BY ad_general.id DESC 
LIMIT 15; 

顯式表名不是必需的,但既用於清晰度和可維護性(明確表名稱將防止任何imbiguities應該ad_general架構或生成的表不斷變化)。

+0

謝謝!這就是我一直在尋找的。這肯定比第一個查詢更快。 – motto 2012-01-15 07:16:28

+0

我認爲outis編輯了一個未知的原因,你的答案和編輯版本不起作用。 – motto 2012-01-17 07:38:48

+0

@motto,我沒有看到錯誤。它似乎只是更明確和更多的字符輸入。我不同意他對格式的看法,但不會開始編輯=) – newtover 2012-01-17 07:53:59

0

您可以自我加入(將表加入自己的表)並將聚合函數應用於第二個。

SELECT `adgen`.`id`, COUNT(`adgen_count`.`id`) AS `count` 
    FROM `ad_general` AS `adgen` 
    JOIN `ad_general` AS `adgen_count` ON `adgen_count`.city = 708 
    WHERE `adgen`.`city` = 708 
    GROUP BY `adgen`.`id` 
    ORDER BY `adgen`.`id` DESC 
    LIMIT 15 

但是,如果不知道表的結構,就不可能說出合適的分組。

+0

無法正常工作。無用 – motto 2012-01-17 07:41:43

+0

@motto:它不起作用,因爲您沒有給我們足夠的信息來編寫正在運行的查詢。閱讀我以前鏈接到的文檔並更新您的問題。 – outis 2012-01-17 10:32:35