Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL]Unikalne wartości z kolumny
Forum PHP.pl > Forum > Przedszkole
i105n2k
Witam,

mam tabelę adresy

id|wojewodztwo|miasto
---------------------------
1|podlaskie|Białystok
2|podlaskie|Ełk
3|podlaskie|Augustów
4|pomorskie|Gdynia
5|pomorskie|Tczew
6|mazowieckie|Warszawa

Chciałbym wyświetlić tabelę bez duplikowania się nazw województw tzn w kolumnie województwo tylko unikalne wartości a w kolumnie miasto wszystkie tzn. tak:

wynik

miasto|wojewodztwo
---------------------------
Białystok|Podlaskie
Ełk|
Augustów|
Gdynia|pomorskie
Tczew
Warszawa|mazowieckie

Jak to zrobić ?

http://sqlfiddle.com/#!2/71360/2
nospor
Ale ty to chcesz wyswietlic na stronie przy pomocy php czy w czystym sql chcesz miec taki wynik?
Sephirus
Hmmm a czemu tak - Powiem szczerze, że nie łatwo jest uzyskać taki efekt - trzeba się posłużyć procedurą by go uzyskać, ewentualnie użyć zmiennej w select - tylko po co takie zabiegi? Chcesz to potem wyświetlić w takiej formie by województwa się nie powtarzały (np w HTML/PHP)? Jeśli tak to tam ignoruj powtarzające się nazwy - będzie łatwiej.
i105n2k
Docelowo chciałbym to wyświetlić w PHP jako tabelę, wiec rozwiązanie po stronie PHP jak najbardziej mnie interesuje.
Daimos
Niech zgadnę, chcesz zrobić tabelę z nagłówkami i dlatego chcesz, żeby woj. było tylko raz?
Nie zawracaj sobie tym głowy, bo jeśli o to Ci chodzi, zrób tak:
  1. $rows[] = array('woj'=>'Lubelskie', 'miasto'=>'Lublin');
  2. $rows[] = array('woj'=>'Lubelskie', 'miasto'=>'Lublin 2');
  3. $rows[] = array('woj'=>'Lubelskie', 'miasto'=>'Lublin 3');
  4. $rows[] = array('woj'=>'Mazowieckie', 'miasto'=>'Warszawa');
  5. $lastHeader = null;
  6. foreach($rows as $row)
  7. {
  8. if(!$lastHeader || $lastHeader != $row['woj'])
  9. {
  10. $lastHeader = $row['woj'];
  11. echo '<h2>'.$row['woj'].'</h2>';
  12. }
  13. echo $row['miasto'].'<br/>';
  14. }


-- zapomniałem dodać, ale chyba logiczne jest, że musisz wtedy sortować po woj. wink.gif
i105n2k
Nie smile.gif Mam tabelę z danymi różnych punktów i chciałbym uniknąć wyświetlania danych które się dublują bo to znacznie pogarsza czytelność.

Myślałem nad pętlą if która porównywałaby wartość z pola województwo w danym rekordzie z wartością z rekordu poprzedniego ale coś mi to nie wychodzi. Kombinowałem w ten sposób:

  1. <?php
  2. $wynik = mysql_query("SELECT wojewodztwo, miasto FROM adresy ORDER BY wojewodztwo")
  3. or die('Błąd zapytania');
  4.  
  5. if(mysql_num_rows($wynik) > 0) {
  6. echo "<table cellpadding=\"2\" border=1>";
  7. while($r = mysql_fetch_assoc($wynik)) {
  8. echo "<tr><td>";
  9.  
  10. if($r['wojewodztwo'] != $(r-1)['wojewodztwo'])
  11.  
  12. {
  13. echo $r['wojewodztwo'];
  14. }
  15. echo "</td>
  16. <td>".$r['miasto']."</td>
  17. </tr>";
  18. }
  19. echo "</table>";
  20. }
  21.  
  22. ?>

Może wartość z pola województwo przypisywać do zmiennej żeby w następnym powtórzeniu pętli while móc ją porównywać ?
nospor
Dostales poprawne rozwiązanie od Daimosa. Czemu z niego nie skorzystasz ?
i105n2k
Jak do rozwiązania daimosa wpleść pobranie danych z bazy ?
mmmmmmm
http://sqlfiddle.com/#!2/71360/16
Daimos
Przerabiasz gotowca, czy chcesz się czegoś nauczyć? ;/
Przecież w moim rozwiązaniu, wystarczy wstawić Twoją pętlę z rekordami bazy:
  1. // zamiast
  2. // foreach($rows as $row)
  3. // wstawiasz swoje:
  4. while($r = mysql_fetch_assoc($wynik))


mmmmmmmm dał Ci też rozwiązanie z zapytaniem
i105n2k
Dzięki smile.gif
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.