Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MYSQL] Grupowanie wyników
DzeSiu
post
Post #1





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 21.11.2006

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


Witam, mam następujące tabele:
cities: city_id, name, province
provinces: province_id, name

Czy ta się za pomocą jednego zapytania wyciągnąć z obu baz nazwy miast i pogrupować je wg nazwy województwa plus zliczyć ilość miast w każdym województwie?

  1. SELECT c.name AS miasto ,p.name AS wojewodztwo, COUNT(c.city_id) AS ile FROM cities c, provinces p WHERE c.province = p.province_id GROUP BY p.province_name


ale nie działa to tak, jakbym chciał.

EDIT
dopiero teraz zauważyłem, że jest oddzielny dział na bazy danych, jakby ktoś to przeniósł to bym był dźwięczny (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował DzeSiu 15.10.2008, 17:12:44
Go to the top of the page
+Quote Post
krzyszbi
post
Post #2





Grupa: Zarejestrowani
Postów: 251
Pomógł: 13
Dołączył: 15.09.2005

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


wybranie mist i dołączenie nazwy województwa to najlepiej JOIN-em
czyli
  1. SELECT
  2. c.city_id,c.name AS miasto,
  3. p.province_id,p.name AS wojewodztwo
  4. FROM cities c
  5. JOIN province p ON c.province=p.province_id

a policzenie miast w województwie chyba bez podzapytania się nie odejdzie
ja wykminiłem coś takiego
  1. SELECT
  2. c.city_id,c.name AS miasto,
  3. p.province_id,p.name AS wojewodztwo,
  4. (SELECT COUNT(city_id) FROM cities c WHERE c.province = p.province_id)AS ile
  5. FROM cities c
  6. JOIN province p ON c.province=p.province_id

sprawdź czy działa tak jak powinno
nie wiem jak chcesz to jeszcze wyświetlać bo to też co nieco może zmienić
Go to the top of the page
+Quote Post
batman
post
Post #3





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Przenoszę na bazy danych -> mysql.
Go to the top of the page
+Quote Post
DzeSiu
post
Post #4





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 21.11.2006

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


(sry, i dzięki za przeniesienie)

Wracając do tematu - działać działa, ale chodziło mi o coś takiego:
w tej chwili wyświetla się to mniej więcej tak:
  1. <?php
  2.    Array(
  3.    [city_id] => 1
  4.    [miasto] => Aleksandrów &#321;ódzki
  5.    [province_id] => 14
  6.    [wojewodztwo] => &#322;ódzkie
  7.    [ile] => 18
  8.    )
  9.    Array(
  10.    [city_id] => 2
  11.    [miasto] => Augustów
  12.    [province_id] => 9
  13.    [wojewodztwo] => podlaskie
  14.    [ile] => 9
  15.    )
  16. etc..
  17. )
  18. ?>


Ja byłbym rad gdyby to wyglądało tak:
  1. <?php
  2.    Array(
  3.    [wojewodztwo] => &#322;ódzkie
  4.    [province_id] => 14
  5.    [ile] => 18
  6.    [miasto] => Array (
  7.       [nazwa] => "cośtam"
  8.       [nazwa] => "cośtam"
  9.       ....
  10.       )
  11.    )
  12. etc..
  13. )
  14. ?>

No chyba, że się nie da, to pozostanie mi wykonanie 16 zapytań, dla każdego województwa osobno

Ten post edytował DzeSiu 15.10.2008, 18:23:10
Go to the top of the page
+Quote Post
krzyszbi
post
Post #5





Grupa: Zarejestrowani
Postów: 251
Pomógł: 13
Dołączył: 15.09.2005

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


właśnie się tak w MySQL-u samym nie dal przynajmniej ja nie wiem ale php pomoże (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

przeleć pętlą i sobie pogrupuj (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)
  1. <?php
  2. $wynik // zakladam ze tu dane z zapytania co podałem
  3. $dane = array();
  4. foreach($wynik as $val){
  5. if (!isset($dane[$val['city_id']]){
  6. $dane[$val['city_id']] = array(
  7.  'wojewodztwo' => $val['wojewodztwo']
  8.  'province_id' => $val['province_id']
  9.  'ile' => $val['ile']
  10.  'miasto' => array();
  11. );
  12. }
  13. $val['city_id']['masta'][] = $val['miasto'];
  14. }
  15. ?>


mniej więcej tak
jedne pętelka jest dużo szybsza niż kolejne 15 zapytań (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) i bazy się niepotrzebnie nie obciąża

p.s. pisane z palca nie wiem czy działa

Ten post edytował krzyszbi 15.10.2008, 18:31:32
Go to the top of the page
+Quote Post
DzeSiu
post
Post #6





Grupa: Zarejestrowani
Postów: 6
Pomógł: 1
Dołączył: 21.11.2006

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


Trochę to zmodyfikowałem i działa tak jak chciałem:

  1. <?php
  2. $dane = array();
  3. foreach($test as $val){
  4. if (!isset($dane[$val->province_id])) {
  5. $dane[$val->province_id] = array(
  6. 'wojewodztwo' => $val->wojewodztwo,
  7. 'province_id' => $val->province_id,
  8. 'ile' => $val->ile,
  9. 'miasta' => array()
  10. );
  11. }
  12. $dane[$val->province_id]['miasta'][] = $val->miasto;
  13. }
  14. ?>


Musiałem też pozmieniać to i owo bo nie mogłem używać obiektów stdClass jako tablicy. Niemniej jednak dzięki wielkie za pomoc, bo tak się chyciłem tego SQL'a, że całkiem zapomniałem o innych rozwiązaniach (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Ten post edytował DzeSiu 15.10.2008, 19:06:32
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: 18.09.2025 - 07:52