我想知道列的值在結果中出現了多少次,並將其包含在每行結果的列中。我怎樣才能實現這一點,而不重複派生表的子查詢兩次?如果我用COUNT子查詢中的「t」替換(derivedtable),它表示該表不存在。mysql - 如何不重複派生表的子查詢
SELECT
col1,
col2,
col3,
(SELECT COUNT(*) FROM (derivedtable) WHERE t.col1=col1)
FROM (derivedtable) AS t
我想知道列的值在結果中出現了多少次,並將其包含在每行結果的列中。我怎樣才能實現這一點,而不重複派生表的子查詢兩次?如果我用COUNT子查詢中的「t」替換(derivedtable),它表示該表不存在。mysql - 如何不重複派生表的子查詢
SELECT
col1,
col2,
col3,
(SELECT COUNT(*) FROM (derivedtable) WHERE t.col1=col1)
FROM (derivedtable) AS t
你可以用group by
嗎?
SELECT col1, col2, col3, COUNT(*)
FROM (derivedtable) AS t
GROUP BY col1;
這將返回col2
和col3
任意值。你可以使用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
的最大值複製到所有行中。
我確實需要一個完整的列表,這就是爲什麼我沒有使用GROUP BY。然而,我在閱讀了這個函數後並不知道group_concat函數,因爲我無法對結果進行任何後處理來將結果分解爲單獨的行,因爲我是將mysql結果直接提供給一個不允許使用的php類。我不會說不可能,但它會非常複雜,如果有的話我需要另一種解決方案。 – navark
@navark。 。 。如果您還從其他列返回值,爲什麼需要通過'col1'進行計數?你不想要每行特定的計數嗎? –
不知道我理解你的問題,但它是特定於每一行的意義上,我需要每一行來評估它自己的col1「WHERE t.col1 = col1」的值。如果可能的話,我完全需要在mysql中完成這項工作,因爲在php中這樣做會非常複雜。 – navark
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;
創建真實視圖的缺點:不可能使用MySQL,因爲它缺少公用表表達式。 –
通過「不重複子查詢」,你的意思是你必須鍵入它兩次,或MySQL是否爲每行結果執行它? –
我的意思是MySQL會執行兩次(比SELECT的每一行實際上多一次),我認爲這是它的工作原理。 – navark