Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Grupowanie i kolejność wyników
johnson
post
Post #1





Grupa: Zarejestrowani
Postów: 90
Pomógł: 2
Dołączył: 3.12.2004

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


Są takie oto rekordy (tabela uzytkownicy):

Kod
+---------+-----------+-------------+
|    id   | zespol_id |    imie     |
+---------+-----------+-------------+
|    1    |     3     |  Karolina   |
|    2    |     3     |  Mateusz    |
|    3    |     3     |  Magda      |
|    4    |     3     |  Andrzej    |
+---------+-----------+-------------+


Teraz grupując zapytaniem:
  1. SELECT count(*) AS liczba, imie, id
  2. FROM uzytkownicy GROUP BY zespol_id


otrzymujemy liczbę użytkowników w danym zespole oraz imię jednego użytkownika w tym teamie oraz jego id, problem polega jednak na tym, że w żaden sposób nie można wpłynąć na to, które imię się wyświetli

Czy można w jakiś sposób wpłynąć na to, które imię się wyświetli (np. posortować alfabetycznie i zwróci się pierwsze; dobrze by też było jakby zwracane było właściwe dla tego użytkownika id)(IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
amwoan
post
Post #2





Grupa: Zarejestrowani
Postów: 9
Pomógł: 0
Dołączył: 16.05.2005

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


Przykładowe rozwiązanie w php:
  1. <?php
  2. mysql_connect('127.0.0.1', 'user', 'pass');
  3.  
  4. $sql = 'CREATE TEMPORARY TABLE tmptbl SELECT t1.domena, MAX( t1.rate ) AS r
  5. FROM domeny AS t1
  6. GROUP BY t1.domena';
  7.  
  8. mysql_query($sql) or die(mysql_error());
  9.  
  10. $sql='SELECT t1.* FROM domeny AS t1 
  11. INNER JOIN tmptbl 
  12. ON t1.domena=tmptbl.domena AND t1.rate = tmptbl.r';
  13.  
  14. $res = mysql_query($sql);
  15.  
  16. echo '<pre>';
  17. while($row = mysql_fetch_assoc($res)){
  18. print_r($row);
  19. }
  20. echo '</pre>';
  21. ?>

Najpierw jest tworzona tymczasowa tabela z domeną i największym ratem dla niej. Później wykonywany jest właściwy SELECT, który wybiera pola z tabeli domeny (tak ją sobie nazwałem) połączonej za pomocą INNER JOINa z tymczasową tabelą tmptbl odpowiednio na polach `domena`<->`domena` oraz `rate`<->`r`. Musisz tylko pamiętać, że to zapytanie wybierze wszystkie strony z danej domeny, które posiadają rate równy największemu. Szczerze mówiąc, nie wiem w tej chwili czy istnieje prosty sposób wyfiltrowania w samym SQLu tylko pojedynczych wpisów dla danej domeny, ale to już można prosto załatwić w samym php.

To jest rozwiązanie dla MySQL 4.0 i niższej, od wersji 4.1 można używać zagnieżdżonych SELECTów i wtedy nie ma potrzeby tworzenia tymczasowej tabeli. Tak to się właśnie robi. Tabela tymczasowa istnieje tylko na czas konkretnego połączenia z bazą (czyli czas działania skryptu) oraz jest widoczna tylko dla danego połączenia (nie ma konfliktu nazw tabeli tymczasowej, nawet w przypadku kilku równoległych połączeń do bazy). Aha, jeszcze jeden wymóg, który tyczy się tylko wersji 4.0, to konieczność posiadania uprawnień do tworzenia tabel tymczasowych.

Jeszcze raz też przestrzegam przed używaniem pól nie poddanych funkcji agregującej, bądź nie będących częścią GROUP BY, kiedy właśnie ta klauzula jest używana.
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 11:54