Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL] Wyświetlanie danych z jednej tabeli
Forum PHP.pl > Forum > Przedszkole
zwieracz
Witam
Mam tabelę w bazie mysql w której są następujące kolumny: id, cytat, autor, zrodlo, tag;
dane w kolumnach: autor, zrodlo, tag; mogą się powtarzać.
Chciałbym pokazać listę autorów na daną literę wraz ze źródłami mniej więcej w ten sposób:

autor1
- zrodlo1, zrodlo2, zrodlo3
autor2
- zrodlo, zrodlo4
autor3
- zr........

na razie zrobiłem coś takiego:

  1. <?php
  2. $q = mysql_query("SELECT DISTINCT autor, FROM xxx
  3. WHERE autor LIKE '".mysql_real_escape_string($_GET['letter'])."%' ORDER BY autor ASC");
  4. while ($x = mysql_fetch_assoc($q))
  5. {
  6. extract($x);
  7. echo $autor;
  8. }
  9. ?>


Co pokazuje mi listę autorów na daną literę przekazywaną przez GET i jest ok. Ale jak dołączyć do każdego autora jego źródła?questionmark.gif
Proszę o wskazówki
webasek
Masz w jednej tabeli nazwiska autorów i ich cytaty itd... jeśli tak to najpierw poczytaj o tworzeniu baz danych (konkretne poszukaj o postaciach normalnych) ew. zapytaj na forum jak stworzyć taką bazę. Odpowiedź na pytanie możesz kombinować z union ale mało efektywne, i jeśli zastosujesz distinct to pojawi się problem baza danych wybierze tylko jeden rekord resztę uzna za takie same. Lepiej zmień bazę danych
HellRider
Cytat(zwieracz @ 17.10.2008, 19:05:25 ) *
Witam
Mam tabelę w bazie mysql w której są następujące kolumny: id, cytat, autor, zrodlo, tag;
dane w kolumnach: autor, zrodlo, tag; mogą się powtarzać.
Chciałbym pokazać listę autorów na daną literę wraz ze źródłami mniej więcej w ten sposób:

autor1
- zrodlo1, zrodlo2, zrodlo3
autor2
- zrodlo, zrodlo4
autor3
- zr........
[CUT]


  1. <?php
  2. $res = mysql_query("SELECT autor FROM tabela WHERE autor LIKE ".$_GET['letter']."% ORDER BY autor ASC");
  3. while ($row = mysql_fetch_row($res, MYSQL_ASSOC)){
  4.  echo $row['autor']; //formatuj dowolnie
  5.  
  6.  $res2 = mysql_query("SELECT zrodlo FROM tabela WHERE autor='".$row['autor']."' ORDER BY zrodlo ASC");
  7.  while ($row2 = mysql_fetch_row($res2, MYSQL_ASSOC)){
  8.    echo $row2['zrodlo']; //formatuj dowolnie
  9.  }
  10. }
  11. ?>


Nie testowałem, ale z zasady powinno działać bez zarzutu.
Ana, wszelkie encapsy i slashe pominąłem dla przejrzystości.
zwieracz
dzięki wielkie

webasek:
W sumie zdaję sobie z tego sprawę że powinienem mieć wszystko w innych tabelach i kiedyś tak będę musiał zrobić. Na razie jednak tabela o której mowa używana jest (i stworzona też) przez plugin wp-quotescollection w wordpressie - ja po prostu chciałem się podłączyć innym skryptem do tej tabeli. winksmiley.jpg
Niestety nie przychodzi mi do głowy jak użyć UNION w takiej sytuacji choć już trochę poczytałem o tym złączeniu.

HellRider:
Twoje rozwiązanie zadziałało - nie użyłem co prawda:
  1. <?php
  2. mysql_fetch_row($res, MYSQL_ASSOC)
  3. ?>

bo nie wiedzieć czemu nie działało to u mnie, a zadziałało:
  1. <?php
  2. ?>

w manualu bowiem przeczytałem o powyższych funkcjach:
Cytat
Godne uwagi jest to, że użycie mysql_fetch_assoc() nie jest znacząco wolniejsze od użycia mysql_fetch_row(), a jest bardziej funkcjonalne.
cokolwiek to znaczy??

W sumie wyszło mi coś takiego:
  1. <?php
  2. $res = mysql_query("SELECT DISTINCT autor FROM tabela WHERE autor LIKE '".mysql_real_escape_string($_GET['letter'])."%' ORDER BY autor ASC");
  3. while ($row = mysql_fetch_assoc($res)){
  4. echo "<div>".$row['autor']; //formatuj dowolnie
  5.  
  6. $res2 = mysql_query("SELECT DISTINCT zrodlo FROM tabela WHERE autor='".$row['autor']."' ORDER BY zrodlo ASC");
  7. while ($row2 = mysql_fetch_assoc($res2)){
  8.   echo "<div>".$row2['zrodlo']."</div> "; //formatuj dowolnie
  9. }
  10. echo "</div>";
  11. }
  12. ?>


Mam jeszcze pytanie o szybkość i obciążenie serwera dotyczące tych zapytań do bazy (jak już webasek wspomniał jedna tabela nie jest najszczęśliwszym rozwiązaniem) i czy rzeczywiście użycie mysql_fetch_assoc($res) zamiast mysql_fetch_row($res, MYSQL_ASSOC) (to nie działa) nie spowolni takiego zapytania?
Dodam że na razie w tablicy jest ok 4k rekordów a będzie 2x tyle.

jeszcze raz dzięki
HellRider
Oj, pomyliłem funkcje, nie chodziło mi o
mysql_fetch_row($res, MYSQL_ASSOC)
tylko o
mysql_fetch_array($res, MYSQL_ASSOC), ups smile.gif Działa bez zarzutu.

EDIT: Przez PHP jest to chyba najpopularniejsza metoda wyciągania danych SQL SELECT.
Aplikacje zazwyczaj nie wyciągają 4000 czy 8000 rekordów z bazy prosto na stronę, lecz
filtrują i wyciągają te właściwe, u Ciebie np. autor na $litera i tylko źródła = $autor.
zwieracz
poprawiłem funkcję na mysql_fetch_array($res, MYSQL_ASSOC) i śmiga winksmiley.jpg

Chodzi mi o ilość zapytań do bazy - proszę mi powiedzieć czy dobrze myślę:
są dwa zapytania $res i $res2
zapytanie $res2 jest wykonywane w pętli "while" czyli ile wyników zwróci zapytanie $res tyle razy będzie wykonywane zapytanie $res2
czyli zapytań do bazy będzie bardzo dużo?? Czy nie zablokuje mi to serwera baz danych na jakimś tam wirtualnym hostingu gdzie mam podwieszone jeszcze inne skrypty które odpytują bazę??
HellRider
Jeżeli szukasz na literę "a" i masz trzech autorów, każdy autor ma 5 źródeł to wykona się to tyle razy:
(3 x autor)
x
(5 x źródło)
----
15 // Prosta matematyka.

Hm, czy zablokuje, nie powinno, fora, takie jak forum.php.pl, wykonują kilka zapytań na jedno odświeżenie strony,
pomnóż to razy ilość odświeżeń na minutę w godzinach szczytu, IP.Board potrafi generować masę zapytań, a wiele for śmiga elegancko smile.gif
To przykład, musisz dowiedzieć się jakie możliwości ma Twój serwer oraz jakie restrykcje nakłada, ale nie panikuj,
bo jak serwer MySQL Ci przy tych dwóch while nie wytrzyma, to zmień serwer.
zwieracz
No tak ale ja mam 30 autorów na a, każdy z nich ma po 5-10 źródeł czyli może być do 300 zapytań na jedno odświeżenie strony.
do tego nosiłem się z zamiarem żeby w ten sam sposób zrobić pobieranie tagów do każdego autora i tu też będzie dużo zapytań, czyli dochodzi następne 300.
Pytam dlatego że parę razy już serwer baz wyrzucił mi komunikat że nie jest dostępny. a do tej pory pracowało tam parę serwisów na joomli i oscommerce całość ok 1k uu dziennie i nie było problemów (większych winksmiley.jpg )
golaod
Słuchaj to jak już się tak bawisz w słuchanie wyżej wypowiadających się panów to ja polecam na każdą kolumnę zrobić osobne zapytania...
  1. <?php
  2. $select = "SELECT * FROM xxx WHERE autor LIKE '".mysql_escape_string(trim(substr($_GET['letter'],0,1)))."%' "; //w końcu jak litera to litera i zabezpieczyć to też trzeba, po drugie jak coś na końcu możesz dodać LIMIT param1,param2  i się pobawić w podstrony
  3. // teraz podczas wywalania na ekran:
  4. $tmp_autor = '';
  5. $selectid = mysql_query($select) or die(mysql_error());
  6. while($wynik = mysql_fetch_array($selectid,MYSQL_ASSOC))
  7. {
  8.  if($tmp_autor!= $wynik['autor'])
  9.  {
  10.    #i tu tworzysz oddzielenie dla nowego autora ktorego wypisujesz tylko raz
  11.  }
  12.  #a tu wyswietlasz reszte rzeczy
  13. }
  14. ?>

Tym sposobem zapytanie jedno.
zwieracz
goload:

Cytat
#i tu tworzysz oddzielenie dla nowego autora ktorego wypisujesz tylko raz

Sęk w tym że nie wiem jak wypisać raz danego autora (wcześniej załatwiałem to poprzez "DISTINCT")

Cytat
#a tu wyswietlasz reszte rzeczy

A tu pewnie jak wyżej

Dzięki za notkę o bezpieczeństwie
golaod
Rozumiem, że troszkę u Ciebie słabo z rozeznaniem w temacie. Nie wiem tylko czy zauważyłeś ale napisałem Ci jako takie rozwiązanie. Czyli jedno zapytanie i jak je wyświetlać. Skoro masz jednak problem, zrobię to jeszcze raz.

  1. <?php
  2. #swiadomie nie pisze polaczenia z baza i wybraniu bazy bo to chyba oczywiste prawda ?
  3. $select = "SELECT * FROM xxx WHERE LIKE '".mysql_escape_string(trim(substr($_GET['letter'],0,1)))."%' ORDER BY autor ASC"; #lub DESC jak kto woli
  4. $selectid = mysql_query($select) or die(__LINE__.mysql_error();
  5. $autor_aktualny = '';
  6. while($wiersz = mysql_fetch_array($selectid,MYSQL_ASSOC)
  7. {
  8.  if($wiersz['autor']!=$autor_aktualny)
  9. {
  10.    echo 'Autor: '.$autor_aktualny.' jego dziela:<br />';
  11.    echo $wiersz['dzielo'];
  12.    $autor_aktualny = $wiersz['autor'];
  13.  }
  14.  else
  15.    echo ','.$wiersz['dzielo'];
  16. }
  17. ?>

No chyba to juz wystarczajaca ilosc kodu prawda ? zmien tylko wiersz['dzielo'] na odpowiedni dla Twojej kolumny z dzielem.
zwieracz
golaod:
Cytat
Rozumiem, że troszkę u Ciebie słabo z rozeznaniem w temacie.

Wiadomo, tak sobie kombinuję trochę.


Myślałem że już sobie poradzę ale jednak nie. Zastosowałem ten algorytm który podałeś w ostatnim poście (z drobną zmianą bo pierwszy wiersz był pusty - zadziałało przesunięcie tego
  1. <?php
  2. $autor_aktualny = $wiersz['autor'];
  3. ?>
na początek pętli if

Wydawało mi się że żeby wyświetlić dane źródło tylko raz; zastosuję sposób który podałeś mi na tacy przy wyświetlaniu raz danego autora - jednak z kolumną autor to się udało bo jest ona sortowana ASC i autorzy są po kolei - kolumna źródło jednak jest posortowana według kolumny autor i ten sam sposób jednak nie wychodzi.

Może jakaś wskazówka? please. hmm może jak posortować kolumnę source by wyświetlić raz dane źródło w ten sam sposób jak "autora" - a może zupełnie inaczej?
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.