2014-03-12 29 views
0

我想知道列的值在結果中出現了多少次,並將其包含在每行結果的列中。我怎樣才能實現這一點,而不重複派生表的子查詢兩次?如果我用COUNT子查詢中的「t」替換(derivedtable),它表示該表不存在。mysql - 如何不重複派生表的子查詢

SELECT 
col1, 
col2, 
col3, 
(SELECT COUNT(*) FROM (derivedtable) WHERE t.col1=col1) 
FROM (derivedtable) AS t 
+0

創建真實視圖的缺點:不可能使用MySQL,因爲它缺少公用表表達式。 –

+0

通過「不重複子查詢」,你的意思是你必須鍵入它兩次,或MySQL是否爲每行結果執行它? –

+0

我的意思是MySQL會執行兩次(比SELECT的每一行實際上多一次),我認爲這是它的工作原理。 – navark

回答

0

你可以用group by嗎?

SELECT col1, col2, col3, COUNT(*) 
FROM (derivedtable) AS t 
GROUP BY col1; 

這將返回col2col3任意值。你可以使用group_concat()的完整列表:

SELECT col1, group_concat(col2) as col2s, group_concat(col3) as col3s, COUNT(*) 
FROM (derivedtable) AS t 
GROUP BY col1; 

編輯:

如果你真的想這樣做,無需反覆派生表,您可以使用變量:

SELECT col1, col2, col3, 
     @col1cnta := if(@col1a = col1, @col1cnta, col1cnt) as col1cnt, 
     @col1a := col 
FROM (SELECT col1, col2, col3, 
      @col1cnt := if(@col1 = col1, 0, @col1cnt) + COUNT(*) as col1cnt, 
      @col1 := col1 
     FROM (derivedtable) t cross join 
      (select @col1 := '', @col1cnt := 0) const 
     GROUP BY col1 
    ) t cross join 
    (select @col1a := '', @col1cnta := 0) const 
ORDER BY col1, col1cnt desc; 

的想法在這裏是爲三列的每個組合執行子計數。然後,按col1對結果進行排序,但將結果按相反順序排序,並將給定的col1的最大值複製到所有行中。

+0

我確實需要一個完整的列表,這就是爲什麼我沒有使用GROUP BY。然而,我在閱讀了這個函數後並不知道group_concat函數,因爲我無法對結果進行任何後處理來將結果分解爲單獨的行,因爲我是將mysql結果直接提供給一個不允許使用的php類。我不會說不可能,但它會非常複雜,如果有的話我需要另一種解決方案。 – navark

+0

@navark。 。 。如果您還從其他列返回值,爲什麼需要通過'col1'進行計數?你不想要每行特定的計數嗎? –

+0

不知道我理解你的問題,但它是特定於每一行的意義上,我需要每一行來評估它自己的col1「WHERE t.col1 = col1」的值。如果可能的話,我完全需要在mysql中完成這項工作,因爲在php中這樣做會非常複雜。 – navark

0
Solution : 

SELECT col1, col2, col3, 
     @col1cnta := if(@col1a = col1, @col1cnta, col1cnt) as col1cntfinal, 
     @col1a := col1 
FROM (SELECT col1, col2, col3, 
      @col1cnt := if(@col1 = col1, @col1cnt+1, 1) as col1cnt, 
      @col1 := col1 
     FROM (derivedtable) t cross join 
      (select @col1 := '', @col1cnt := 0) const 
     ORDER BY col1 
    ) t2 cross join 
      (select @col1a := '', @col1cnta := 0) const 
ORDER BY col1, col1cnt desc;