Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zapytanie:policz wiele agregatów na przedmiot

Oto sztuczka:obliczanie SUM() wartości, o których wiadomo, że są równe 1 lub 0, jest równoważne COUNT() wierszy, w których wartość wynosi 1. I wiesz, że porównanie logiczne zwraca 1 lub 0 (lub NULL).

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid;

Jeśli chodzi o dodatkowe pytanie, możesz po prostu wykonać sprzężenie wewnętrzne zamiast sprzężenia zewnętrznego, co oznaczałoby tylko kategorie z co najmniej jednym wierszem w map zostanie zwrócony.

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  INNER JOIN map m USING (catid)
  INNER JOIN items i USING (itemid)
GROUP BY c.catid;

Oto inne rozwiązanie, które nie jest tak wydajne, ale pokażę je, aby wyjaśnić, dlaczego wystąpił błąd:

SELECT c.catname, COUNT(m.catid) AS item_count,
  SUM(i.ownerid = @ownerid) AS owner_item_count
FROM categories c
  LEFT JOIN map m USING (catid)
  LEFT JOIN items i USING (itemid)
GROUP BY c.catid
HAVING item_count > 0;

Nie możesz używać aliasów kolumn w WHERE klauzula, ponieważ wyrażenia w WHERE klauzule są oceniane przed wyrażeniami na liście wyboru. Innymi słowy, wartości powiązane z wyrażeniami listy wyboru nie są jeszcze dostępne.

Możesz używać aliasów kolumn w GROUP BY , HAVING i ORDER BY klauzule. Klauzule te są uruchamiane po przeanalizowaniu wszystkich wyrażeń z listy wyboru.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę wyświetlić czas zapytania w Perl, DBI?

  2. Czy 'IS DISTINCT FROM' to prawdziwy operator MySQL?

  3. MySQL - wstaw, jeśli jeszcze nie istnieje

  4. Jak zatrzymać MySQL w instalacji Mac OS?

  5. Używanie klauzuli IN w MySQL z określonymi wartościami