2013-04-21 71 views
0

我兩條表:怎麼辦MAX(COUNT(*)),在SQL

prgm[id,name] 
notes[id,note,id_prgm] 

其實,我知道PRGM一些信息的請求:

SELECT p.id, name, AVG(note), COUNT(note) 
FROM notes n 
    JOIN prgm p 
    ON p.id=n.id_prgm 
GROUP BY p.id 

這工作如預期的那樣,但現在我想知道的AVG(note)COUNT(note),但是如果我做了MAX(COUNT(note))它會返回一個錯誤:Invalid use of group function。我明白爲什麼會出現這個問題,但我不知道如何解決這個問題。

我看到的唯一方法是做兩個子請求並將其放在MAX()之內,但是有沒有比兩個子請求更好的方法?

(我在MySQL的使用PHP)

回答

3

的simpliest的答案是,

SELECT p.id, name, AVG(note), COUNT(note) totalCount 
FROM notes n 
     INNER JOIN prgm p 
      ON p.id=n.id_prgm 
GROUP BY p.id 
ORDER BY totalCount DESC 
LIMIT 1 

但缺點是,它不關心具有最高計數重複記錄。另一種選擇是,

SELECT p.id, name, AVG(note), COUNT(note) 
FROM notes n 
     INNER JOIN prgm p 
      ON p.id=n.id_prgm 
GROUP BY p.id 
HAVING COUNT(note) = 
     (
      SELECT DISTINCT COUNT(note) totalCount 
      FROM notes n 
        INNER JOIN prgm p 
         ON p.id=n.id_prgm 
      GROUP BY p.id 
      ORDER BY totalCount DESC 
      LIMIT 1 
     ) 
+0

重複記錄的問題不是一個在這裏,因爲我只需要論文MAX,沒有其他信息。目標是在我給出的查詢中的公式中使用這些最大值。但是也許我可以做你的第一個查詢,在一個php var中獲取MAX值,並在第二個查詢中使用它來獲得所有prgm的信息?我最好只做一個查詢,但如果沒有更好的方法,我會這樣做。謝謝 – Alabate 2013-04-21 16:29:33

0

您可以用order bylimit要麼柱做到這一點:

SELECT p.id, name, AVG(note), COUNT(note) 
FROM notes n 
    JOIN prgm p 
    ON p.id=n.id_prgm 
GROUP BY p.id 
order by avg(note) desc 
limit 1 

要在同一時間都做,需要一些子查詢。我想正是如此做:

select t.id, t.name, t.avgnote, t.countnote 
from (select max(avgnote) as maxavg, max(countnote) as maxcount 
     from (SELECT p.id, name, AVG(note) as avgnote, COUNT(note) as countnote 
      FROM notes n 
       JOIN prgm p 
       ON p.id=n.id_prgm 
      GROUP BY p.id 
      ) t 
    ) themax join 
    (SELECT p.id, name, AVG(note) as avgnote, COUNT(note) as countnote 
     FROM notes n 
      JOIN prgm p 
      ON p.id=n.id_prgm 
     GROUP BY p.id 
    ) t 
    on t.avgnote = themax.avgnote or t.countnote = themax.countnote 
+0

正如我在JW comment的評論中解釋的,我的目標是在我給出的查詢中使用公式中的最大值。我不確定是否理解你的第二個查詢:它的目標是給我所有prgm與max的列表,對嗎?所以這不是我搜索的內容,因爲我只需要這些MAX。但是我可以使用你的第一個查詢,在一個PHP變量中獲取MAX值並在第二個查詢中使用它來獲得所有的prgm信息?我最好只做一個查詢,但如果沒有更好的。 (也許我不好解釋,因爲你們都不明白我會怎麼做,對不起),謝謝。 – Alabate 2013-04-21 16:37:42

0

這是一些TESTDATA數據庫(與Access,MySQL和Oracle兼容):

CREATE TABLE notes (
    id int NOT NULL, 
    note int NOT NULL, 
    id_prgm int NOT NULL 
); 

INSERT INTO notes (id, note, id_prgm) VALUES (1, 4, 1); 
INSERT INTO notes (id, note, id_prgm) VALUES (3, 16, 1); 
INSERT INTO notes (id, note, id_prgm) VALUES (4, 3, 2); 
INSERT INTO notes (id, note, id_prgm) VALUES (5, 4, 2); 
INSERT INTO notes (id, note, id_prgm) VALUES (6, 5, 2); 

ALTER TABLE notes 
ADD PRIMARY KEY (id); 

CREATE TABLE prgm (
    id int NOT NULL, 
    name varchar(255) NOT NULL 
); 

INSERT INTO prgm (id, name) VALUES (0, 'program 1'); 
INSERT INTO prgm (id, name) VALUES (1, 'program 1'); 
INSERT INTO prgm (id, name) VALUES (2, 'program 2'); 

ALTER TABLE prgm 
ADD PRIMARY KEY (id); 

您的疑問:

SELECT p.id, name, AVG(note), COUNT(note) 
FROM notes n 
    JOIN prgm p 
    ON p.id=n.id_prgm 
GROUP BY p.id 

回報這些記錄:

id name  AVG(note) COUNT(note)  
1 program 1 10.0000  2 
2 program 2 4.0000  3 

如果y OU只希望AVG的MAX和COUNT列中使用此查詢:

select max(avg_note), max(count_note) 
from (
    SELECT AVG(note) as avg_note, COUNT(note) as count_note 
    FROM notes n, prgm p 
    WHERE p.id=n.id_prgm 
    GROUP BY p.id 
) temptable 

該查詢是不是也與MySQL,但也與Access和Oracle兼容的,因爲我改變了JOIN ON ..在FROM表1,表2 WHERE。 而我刪除了名稱字段在SELECT中未包含在GROUP BY中。

由於性能/內存原因,我還刪除了SELECT中不必要的字段p.id

查詢將返回:

max(avg_note) max(count_note)  
10.0000   3