Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Jedna kwerenda czy dwie
KR2615
post
Post #1





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


  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.
Go to the top of the page
+Quote Post
KR2615
post
Post #3





Grupa: Zarejestrowani
Postów: 311
Pomógł: 13
Dołączył: 7.05.2007

Ostrzeżenie: (0%)
-----


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ć
Go to the top of the page
+Quote Post
Crozin
post
Post #4





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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. */
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #5





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

Ostrzeżenie: (0%)
-----


  1. SELECT count(*) AS total, count(case when moderated = 1 then moderated END) AS moderated FROM news WHERE author = 1
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.12.2025 - 20:09