Mysql връща само един ред, когато използва Count

Ами току-що попаднах на странно поведение, което никога преди не съм виждал или не съм забелязал.

Използвам тази заявка:

  SELECT *, 
         COUNT(*) AS pages 
    FROM notis 
   WHERE cid = 20 
ORDER BY nid DESC 
   LIMIT 0, 3

...да прочета 3 елемента, но докато правя това, искам да получа общите редове.

Проблемът е...

...когато използвам count, заявката връща само един ред, но ако премахна COUNT(*) AS pages -- получавам 3-те реда, както предполагам. Очевидно пропускам нещо тук.


person Breezer    schedule 02.11.2010    source източник
comment
Имате нужда от нещо като Window Functions, които за съжаление не се поддържат от MySQL. Ще трябва да направите две отделни заявки.   -  person Pablo Santa Cruz    schedule 03.11.2010
comment
Дори и тогава данните не се събират. Това, което той всъщност иска, е подобно на За първите трима души в отдел 20, дайте ми собственото и фамилното им име и общия брой хора в отдел 20. Да, можете да попитате това, но няма смисъл да попитате това, защото ще получите общия брой хора в отдела 20 три пъти.   -  person McKay    schedule 03.11.2010
comment
ами наистина ли е толкова глупав въпросът, искам да кажа, че ми се струва доста логично да попитате за всички хора в отдел и да получите информацията за 3-мата първи, които са се преместили   -  person Breezer    schedule 03.11.2010
comment
@Breezer, тогава поискайте това: изберете count(*) от notis, където cid =20; изберете * от notis, където cid=20 ограничение 0,3   -  person McKay    schedule 03.11.2010
comment
@Breezer искаш две различни данни. Поискайте ги отделно, не се опитвайте да ги комбинирате в една заявка, където няма смисъл.   -  person McKay    schedule 03.11.2010
comment
да, сега го разбрах, но се надявах, че няма да има нужда да правя 2 заявки срещу db   -  person Breezer    schedule 03.11.2010


Отговори (3)


Да, броячът е обобщен оператор, който прави върнат само един ред (без група по клауза)

Може би да направите две отделни заявки? Няма смисъл редът да връща данните и общия брой редове, защото тези данни не принадлежат заедно.

Ако наистина го искате, можете да направите нещо подобно:

SELECT *, (select count(*) FROM notis WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

или това:

SELECT N.*, C.total from notis N join (select count(*) total FROM notis WHERE cid=20) C WHERE cid=20) AS count FROM notis WHERE cid=20 ORDER BY nid DESC LIMIT 0,3

С варианти на вложения израз в зависимост от вашия SQL диалект.

person McKay    schedule 02.11.2010
comment
да, това изглежда е последната възможност за две обаждания, благодаря - person Breezer; 03.11.2010

Използването на агрегатна функция без GROUP BY винаги ще върне един ред, независимо от всичко. Трябва да използвате GROUP BY, ако искате да върнете повече от един ред.

Обърнете внимание, че при повечето RDBMS подобна заявка би се провалила, защото няма смисъл.

person Vincent Savard    schedule 02.11.2010
comment
но ако използвам group by функцията count връща 1 като резултат - person Breezer; 03.11.2010
comment
Да, както каза Пабло Санта Круз, ще трябва да използвате функция за прозорец, но тя не се поддържа от MySQL. Ще трябва да направите 2 запитвания. - person Vincent Savard; 03.11.2010

Това е неефективно, но ще работи:

SELECT 
   *,
   (SELECT COUNT(*) FROM notis WHERE cid=20) AS pages
FROM notis 
WHERE cid=20 
ORDER BY nid DESC 
LIMIT 0,3
person Hamish    schedule 02.11.2010