2013-04-21 3 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 

И эту работу как и ожидалось, но теперь я хочу знать MAX от AVG(note) и от COUNT(note), но если я сделаю MAX(COUNT(note)), он возвращает мне ошибку: Invalid use of group function. Я понимаю, почему существует эта проблема, но я не знаю, как ее исправить.

Единственный способ, я вижу, состоит в том, чтобы сделать два подзапроса и положить его внутри MAX(), но есть ли лучший способ, чем два подзапроса?

(я на MySql с PHP)

ответ

3

Самый простой ответ был бы,

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, а не другая информация. Цель состоит в том, чтобы использовать тезисы max в формуле в запросе, который я даю. Но, возможно, я могу сделать свой первый запрос, получить значения MAX в php var и использовать его во втором запросе, чтобы получить всю информацию prgm? Я предпочитаю делать только один запрос, но если нет лучшего способа, я сделаю это.Спасибо – Alabate

0

Вы можете сделать это либо для столбца с order by и limit:

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 웃, моя цель - использовать тезисы max в формуле в запросе, который я даю. И я не уверен, что понял ваш второй запрос: цель - дать мне список всех prgm с max, не так ли? так что это не то, что я ищу, потому что мне нужны только тезисы MAX. Но я могу использовать ваш первый запрос, получить значения MAX в php var и использовать его во втором запросе, чтобы получить всю информацию prgm? Я предпочитаю делать только один запрос, но если нет лучшего. (Может быть, я плохо объясню, потому что вы оба не понимали действительно, что я хотел бы, извините за это) и спасибо. – Alabate

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 НУ хочу только Мах AVG и 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 table1, table2 WHERE. . И я удалил поле в SELECT, которое не было включено в GROUP BY.

Я также удалил ненужное поле p.id в SELECT по причине работоспособность/память причины.

запрос возвратит:

max(avg_note) max(count_note)  
10.0000   3