2009-01-13 23 views
1

我開始查詢:如何在不丟失查詢中的信息的情況下混合使用COUNT()和非COUNT()列?

SELECT strip.name as strip, character.name as character 
    from strips, characters, appearances 
where strips.id = appearances.strip_id 
    and characters.id = appearances.character.id 
    and appearances.date in (...) 

這產生了我一些結果:

strip     | character 
'Calvin & Hobbes'  | 'Calvin' 
'Calvin & Hobbes'  | 'Hobbes' 
'Pearls Before Swine' | 'Pig' 
'Pearls Before Swine' | 'Rat' 
'Pearls Before Swine' | 'Hobbes' # a guest appearance 
'Pearls Before Swine' | 'Calvin' # a guest appearance 

然後,我想還可以得到次被使用的字符數的COUNT(任意條)在結果集內。所以,我想:

SELECT count(character.id), strip.name as strip, character.name as character 
    from strips, characters, appearances 
where strips.id = appearances.strip_id 
    and characters.id = appearances.character.id 
    and appearances.date in (...) 

但是,這給了我

[ERROR 11:20:17] Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause 

所以,我想:

SELECT count(character.id), strip.name as strip, character.name as character 
    from strips, characters, appearances 
where strips.id = appearances.strip_id 
    and characters.id = appearances.character.id 
    and appearances.date in (...) 
group by character.id 

這給了我

count | strip     | character 
4  | 'Calvin & Hobbes'  | 'Calvin' 
4  | 'Calvin & Hobbes'  | 'Hobbes' 
2  | 'Pearls Before Swine' | 'Pig' 
2  | 'Pearls Before Swine' | 'Rat' 

也就是說,我失去所有的有關哪些字符出現在哪個st的額外信息撕裂。

我想獲得的是:

count | strip     | character 
4  | 'Calvin & Hobbes'  | 'Calvin' 
4  | 'Calvin & Hobbes'  | 'Hobbes' 
2  | 'Pearls Before Swine' | 'Pig' 
2  | 'Pearls Before Swine' | 'Rat' 
4  | 'Pearls Before Swine' | 'Calvin' 
4  | 'Pearls Before Swine' | 'Hobbes' 

但我似乎無法弄清楚。如果它很重要,我在MySQL上。也許它只需要兩個查詢。

回答

3

mySQL是否支持分析函數?像:

SELECT foo.bar, baz.yoo, count(baz.yoo) over (partition by foo.bar) as yoo_count 
from foo, bar 
where foo.baz_id = baz.id and baz.id in (...) 

或者:

SELECT foo.bar, baz.yoo, v.yoo_count 
from foo, bar, 
(select foo.baz_id, count(*) as yoo_count 
    from foo 
    group by foo.baz_id 
) as v 
where foo.baz_id = baz.id and baz.id in (...) 
and v.baz_id = foo.baz_id; 
+0

MySQL不會執行分區,後者給我錯誤消息「子查詢返回多於一行」。 – 2009-01-13 16:50:59

0

在RDBMS系統上,我將計數查詢選擇到臨時表中,然後將臨時表重新加入到主表中。這會給你兩全其美的。

雖然我不知道mySQL是否支持臨時表。

0

如果MySQL支持Analytics(分析)/窗口功能,則:

select bar, yoo, 
    count(yoo) over (partition by yoo) c 
from t 
/

否則你就需要使用相關子查詢:

select bar, yoo, 
    (select count(yoo) from t t2 where t2.yoo=t.yoo) c 
from t 
/

在Oracle,測試數據的樣子:

create table t(bar number, yoo varchar2(16)); 

insert into t(bar, yoo) values (1, 'hello'); 

insert into t(bar, yoo) values (2, 'goodbye'); 

insert into t(bar, yoo) values (3, 'goodbye'); 

insert into t(bar, yoo) values (4, 'goodbye'); 

insert into t(bar, yoo) values (2, 'calvin'); 

insert into t(bar, yoo) values (5, 'Hobbes'); 

insert into t(bar, yoo) values (6, 'Hobbes'); 

commit; 
0

子選項:

SELECT foo.bar 
    ,baz.yoo 
    ,(SELECT COUNT(*) FROM baz AS baz2 WHERE baz2.yoo = baz.yoo etc.) AS yoo_count 
FROM foo, baz 
WHERE foo.baz_id = baz.id 
    AND baz.id in (...) 

您也可以採用子選擇並嵌套它並加入。

+0

不,這給了我爲每行返回的所有行的總數。 – 2009-01-13 16:47:57

1

foo.bar分組怎麼樣?

SELECT count(baz.id) as count, foo.bar, baz.yoo where foo.baz_id = baz.id and baz.id in (...) group by foo.bar 
0

如果我要被要求這樣一個計數域相當經常然後我創建了一個用戶定義的函數返回值,只是使用內正常選擇。

相關問題