Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MYSQL] Grupowanie wyników
Forum PHP.pl > Forum > Bazy danych > MySQL
DzeSiu
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 winksmiley.jpg
krzyszbi
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ć
batman
Przenoszę na bazy danych -> mysql.
DzeSiu
(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
krzyszbi
właśnie się tak w MySQL-u samym nie dal przynajmniej ja nie wiem ale php pomoże smile.gif

przeleć pętlą i sobie pogrupuj 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ń smile.gif i bazy się niepotrzebnie nie obciąża

p.s. pisane z palca nie wiem czy działa
DzeSiu
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 winksmiley.jpg
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.