Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Jedna kwerenda czy dwie
Forum PHP.pl > Forum > Bazy danych > MySQL
KR2615
Szybkie pytanko do bardziej "obcykanych" w MySQLu ode mmnie: Czy takie zapytanie:
  1. SELECT count(*) FROM news WHERE author = 1 AS total, count(*) FROM news WHERE author = 1 AND moderated = 1 AS moderated

da się obrobić jedną kwerendą czy trzeba rozbijać na dwie?
Crozin
  1. SELECT count(*) AS cnt, moderated FROM news WHERE author = 1 GROUP BY moderated
Takie coś, zakładając, że w kolumnie moderated są wartości 0/1 zwróci Ci dwa wiersze, jedno z liczbą sprawdzonych, drugie z liczbą niesprawdzonych aktualności. Łączną liczbę możesz sobie wyliczyć jako sumę tych dwóch wierszy.
KR2615
Czaję motyw. Zwraca takiego arraya:
Kod
cnt     moderated     
3     0
1     1

Gdzie moderated rozumiem odpowiada stanowi tego newsa (0 oczekujacy, 1 dodany, -1 usuniety itp) Ale czy zawsze wyniki będą zwracane w kolejności co do ilości czy mozna je posortować wg stanu moderated? Co jeśli user bedzie miał tylko usunięte i dodane newsy (stany 1 i -1) Wtedy nie będę miał środkowego wiersza. Obawiam się, że moge się w tym pokrcić
Crozin
1. Nie ma klauzuli ORDER BY więc należy uważać kolejność zwracanych wierszy za [b]kompletnie losową[b].
2. Jeżeli dany użytkownik nie ma aktualności w danym stanie nie zostanie zwrócony dla niego rekord, także wartość 0 trzeba ustalić sobie na poziomie np. PHP - można zrobić to po stronie bazy danych (również zliczanie łącznej wartości) ale łatwiej jest to zrobić po stronie aplikacji.

Przykładowo mógłbyś zrealizować sobie to tak:
  1. const NEWS_TYPE_AWAITING = 0;
  2. const NEWS_TYPE_ADDED = 1;
  3. const NEWS_TYPE_DELETED = -1;
  4.  
  5. $details = [
  6. NEWS_TYPE_AWAITING => 0,
  7. NEWS_TYPE_ADDED => 0,
  8. NEWS_TYPE_DELETED => 0
  9. ];
  10.  
  11. foreach ($db->query(...)->fetchAll() as $row) {
  12. $details[$row['moderated']] = $row['cnt']
  13. }
  14.  
  15. $result = [
  16. 'details' => $details,
  17. 'total' => array_sum($details)
  18. ];
  19.  
  20. print_r($result);
  21.  
  22. /*
  23. Array (
  24.   [details] => Array (
  25.   [NEWS_TYPE_AWAITING] => 0,
  26.   [NEWS_TYPE_ADDED] => 100,
  27.   [NEWS_TYPE_DELETED] => 23
  28.   ),
  29.   [total] => 123
  30. )
  31. */
mmmmmmm
  1. SELECT count(*) AS total, count(case when moderated = 1 then moderated END) AS moderated FROM news WHERE author = 1
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.