Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP + MySQL] Sortowanie danych pobranych z bazy danych
Forum PHP.pl > Forum > Przedszkole
henio
Mam pewien kłopot z posortowaniem. Otóż mam tabele forum_topic i forum_post i chce posortowac wszystkie tematy malejąco po ostatnim dodanym poscie w danym temacie.
Fragment kodu:
  1. <?php
  2. elseif(@$_GET['id_forum_watek'] && @$_GET['id_forum_dzial'])
  3. {
  4. naglowekforum("Zobacz forum numer ".@$_GET['id_forum_dzial']."");
  5. echo "<a href='index.php?id_forum_dzial=".@$_GET['id_forum_dzial']."&id_forum_watek=".@$_GET['id_forum_watek']."&czynnosc=utworz_topic'>Utwórz nowy temat</a>\n";
  6. echo "<table align='center' width='90%' border='1' style='border-collapse: collapse'><tr bgcolor='#CCCFF'>";
  7. echo "<th colspan='2'>Ważne tematy</th><th width='50'>Posty</th><th width='100'>Autor</th><th width='150'>Ostatni post</th>\n";
  8. echo "</table><br />\n";
  9. echo "<table align='center' width='90%' border='1' style='border-collapse: collapse'><tr bgcolor='#CCCFF'>";
  10. echo "<th colspan='2'>Tematy</th><th width='50'>Posty</th><th width='100'>Autor</th><th width='150'>Ostatni post</th>\n";
  11.  
  12. $query4 = "SELECT * FROM forum_topic WHERE id_forum_dzial = '".@$_GET['id_forum_dzial']."' AND id_forum_watek='".@$_GET['id_forum_watek']."'";
  13. $result4 = mysqli_query($mysql, $query4) or die('zapytanie: '.$query4.'---blad:'.mysqli_error($mysql));
  14.  
  15. while ($row4 = mysqli_fetch_assoc($result4))
  16. {
  17. echo "<tr><td>=></td><td width='60%'><a href='index.php?id_forum_dzial=".@$_GET['id_forum_dzial']."&id_forum_watek=".@$_GET['id_forum_watek']."&id_forum_topic=".$row4['id_forum_topic']."'>".$row4['tytul']."</a><br />".$row4['podtytul']."</td><td>";
  18.  
  19. $query8 = "SELECT * FROM forum_post WHERE id_forum_topic = '".$row4['id_forum_topic']."'";
  20. $result8 = mysqli_query($mysql, $query8) or die('zapytanie: '.$query8.'---blad:'.mysqli_error($mysql));
  21. $liczba_postow = mysqli_num_rows($result8);
  22. echo "".$liczba_postow."</td><td>";
  23.  
  24. $query5 = "SELECT nick FROM forum_uzytkownicy WHERE id_forum_user = '".$row4['id_forum_user']."'";
  25. $result5 = mysqli_query($mysql, $query5) or die('zapytanie: '.$query5.'---blad:'.mysqli_error($mysql));
  26. while ($row5 = mysqli_fetch_assoc($result5))
  27. {
  28. echo "".$row5['nick']."</td><td>";
  29. }
  30.  
  31. $query6 = "SELECT data_powstania, id_forum_user FROM forum_post WHERE id_forum_topic =
     '"
    .$row4['id_forum_topic']."' ORDER BY data_powstania DESC LIMIT 0,1";
  32. $result6 = mysqli_query($mysql, $query6) or die('zapytanie: '.$query6.'---blad:'.mysqli_error($mysql));
  33. while ($row6 = mysqli_fetch_assoc($result6))
  34. {
  35. echo "".$row6['data_powstania']."<br />";
  36. $query7 = "SELECT nick FROM forum_uzytkownicy WHERE id_forum_user = '".$row6['id_forum_user']."'";
  37. $result7 = mysqli_query($mysql, $query7) or die('zapytanie: '.$query7.'---blad:'.mysqli_error($mysql));
  38. while ($row7 = mysqli_fetch_assoc($result7))
  39. {
  40. echo "".$row7['nick']."</td>";
  41. }
  42. }
  43. echo "</tr>\n";
  44. }
  45. echo "</table>\n";
  46. }
  47. ?>
JaRoPHP
@henio na czym dokładnie polega problem? Nie sortuje? Źle sortuje?

Nie rozumiem Twojej konstrukcji: @$_GET['id_forum_dzial']. Na Twoim miejscu sprawdzałbym (isset" title="Zobacz w manualu PHP" target="_manual, empty" title="Zobacz w manualu PHP" target="_manual) czy zmienna istnieje i czy ma poprawny typ, a nie stosował owej sztuczki...
henio
Chodzi mi o to, że chciałbym aby tematy były poukładane malejąco po dacie ostatniego posta w temacie. Obecnie zaś data ostatniego postu nie wpływa na kolejność tematów.
webdice
Nie chce mi się analizować tego kodu, sortowanie możesz uzyskać poprzez zapytanie:

  1. SELECT * FROM `tabela` ORDER BY `data` DESC
JaRoPHP
Masz sporo zapytań - trudno zgadnąć, które chcesz zmodyfikować smile.gif.

Podejrzewam, że musisz:
- dokonać złączenia,
- zastosować ORDER BY.

Napisz dokładnie, które zapytanie odpowiada Twojemu problemowi, oraz napisz, jaka jest struktura Twych tabel (forum_topic i forum_post).
henio
Wiem jak się sortuje. Przeczytaj moje posty wyżej

Cytat(JaRoPHP @ 23.12.2007, 15:11:15 ) *
Masz sporo zapytań - trudno zgadnąć, które chcesz zmodyfikować smile.gif.

Podejrzewam, że musisz:
- dokonać złączenia,
- zastosować ORDER BY.

Napisz dokładnie, które zapytanie odpowiada Twojemu problemowi, oraz napisz, jaka jest struktura Twych tabel (forum_topic i forum_post).


Dobrze:
Skruktura tabeli:
a) forum_topic
id_forum_topic - INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT
tytul - VARCHAR(25) NOT NULL
podtytul - VARCHAR(65) DEFAULT NULL
id_forum_user - INTEGER NOT NULL
id_forum_dzial - INTEGER NOT NULL
id_forum_watek - INTEGER NOT NULL
data_powstania - VARCHAR(18) NOT NULL

cool.gif forum_post
id_forum_post - INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT
tytul - VARCHAR(25)
tresc - TEXT
id_forum_user - INTEGER NOT NULL
id_forum_dzial - INTEGER NOT NULL
id_forum_watek - INTEGER NOT NULL
id_forum_topic - INTEGER NOT NULL
data_powstania - VARCHAR(18) NOT NULL

Właśnie prawdopodobnie należałoby użyć łączenia tabel.

  1. <?php
  2. $query4 = "SELECT * FROM forum_topic WHERE id_forum_dzial = '".@$_GET['id_forum_dzial']."' AND id_forum_watek='".@$_GET['id_forum_watek']."'";
  3. $result4 = mysqli_query($mysql, $query4) or die('zapytanie: '.$query4.'---blad:'.mysqli_error($mysql));
  4. ?>

To zapytanie pobiera tematy i mogę je posortować po dacie powstanie topica.


A to:
  1. <?php
  2. $query6 = "SELECT data_powstania, id_forum_user FROM forum_post WHERE id_forum_topic =
     '"
    .$row4['id_forum_topic']."' ORDER BY data_powstania DESC LIMIT 0,1";
  3. $result6 = mysqli_query($mysql, $query6) or die('zapytanie: '.$query6.'---blad:'.mysqli_error($mysql));
  4. ?>

Ostatni post wybiera
JaRoPHP
Powinno działać:
  1. SELECT t.id_forum_topic, t.tytul, max(p.data_powstania)
  2. FROM forum_topic AS t
  3. JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic)
  4. GROUP BY p.id_forum_post
  5. ORDER BY max(p.data_powstania) DESC

Problemy:
- data_powstania - nie powinna być polem VARCHAR. MySQL obsługuje odpowiednie formaty dat: Date and Time Types.
- aby zapytanie działało sybciej, lepiej jest wypisać kolumny (nawet jeśli trzeba wypisać wszystkie), niż stosować znak "*".

-- EDIT (do posta poniżej)
Tak t. = forum_topic co wynika z aliasu forum_topic AS t
henio
Cytat(JaRoPHP @ 23.12.2007, 16:20:30 ) *
Powinno działać:
  1. SELECT t.id_forum_topic, t.tytul, max(p.data_powstania)
  2. FROM forum_topic AS t
  3. JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic)
  4. GROUP BY p.id_forum_post
  5. ORDER BY max(p.data_powstania) DESC

Problemy:
- data_powstania - nie powinna być polem VARCHAR. MySQL obsługuje odpowiednie formaty dat: Date and Time Types.
- aby zapytanie działało sybciej, lepiej jest wypisać kolumny (nawet jeśli trzeba wypisać wszystkie), niż stosować znak "*".

Czy t. = forum_topic?

  1. <?php
  2. $query4 = "SELECT t.id_forum_topic, t.tytul, max(p.data_powstania) 
  3.  FROM forum_topic AS t 
  4.  JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic) 
  5.  GROUP BY p.id_forum_post 
  6.  WHERE t.id_forum_dzial = '".@$_GET['id_forum_dzial']."' AND t.id_forum_watek='".@$_GET['id_forum_watek']."' 
  7.  ORDER BY max(p.data_powstania) DESC";
  8. ?>

Wyświetla mi:

zapytanie: SELECT t.id_forum_topic, t.tytul, max(p.data_powstania) FROM forum_topic AS t JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic) GROUP BY p.id_forum_post WHERE t.id_forum_dzial = '1' AND t.id_forum_watek='1' ORDER BY max(p.data_powstania) DESC---blad:You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE t.id_forum_dzial = '1' AND t.id_forum_watek='1' ORDER BY max(p.dat' at line 5
JaRoPHP
Składnia zapytania SELECT.

Jednym słowem, WHERE ma być przed GROUP BY
henio
To już poprawiłem. Tylko że obecnie wyświetla mi te tematy tyle razy ile jest postów.

Np:
=> Koszulki 3 Henio Dzisiaj o 14:57 Heniek
=> Koszulki 3 Henio Dzisiaj o 14:57 Heniek
fragment kodu:
  1. <?php
  2. elseif(@$_GET['id_forum_watek'] && @$_GET['id_forum_dzial'])
  3. {
  4. naglowekforum("Zobacz forum numer ".@$_GET['id_forum_dzial']."");
  5. echo "<a href='index.php?id_forum_dzial=".@$_GET['id_forum_dzial']."&id_forum_watek=".@$_GET['id_forum_watek']."&czynnosc=utworz_topic'>Utwórz nowy temat</a>\n";
  6. echo "<table align='center' width='90%' border='1' style='border-collapse: collapse'><tr bgcolor='#CCCFF'>";
  7. echo "<th colspan='2'>Ważne tematy</th><th width='50'>Posty</th><th width='100'>Autor</th><th width='150'>Ostatni post</th>\n";
  8. echo "</table><br />\n";
  9. echo "<table align='center' width='90%' border='1' style='border-collapse: collapse'><tr bgcolor='#CCCFF'>";
  10. echo "<th colspan='2'>Tematy</th><th width='50'>Posty</th><th width='100'>Autor</th><th width='150'>Ostatni post</th>\n";
  11.  
  12. $query4 = "SELECT t.id_forum_topic, t.tytul, t.podtytul, t.id_forum_user, max(p.data_powstania) 
  13.  FROM forum_topic AS t 
  14.  JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic) 
  15.  WHERE t.id_forum_dzial = '".@$_GET['id_forum_dzial']."' AND t.id_forum_watek='".@$_GET['id_forum_watek']."' 
  16.  GROUP BY p.id_forum_post 
  17.  ORDER BY max(p.data_powstania) DESC";
  18. $result4 = mysqli_query($mysql, $query4) or die('zapytanie: '.$query4.'---blad:'.mysqli_error($mysql));
  19.  
  20. while ($row4 = mysqli_fetch_assoc($result4))
  21. {
  22. echo "<tr><td>=></td><td width='60%'><a href='index.php?id_forum_dzial=".@$_GET['id_forum_dzial']."&id_forum_watek=".@$_GET['id_forum_watek']."&id_forum_topic=".$row4['id_forum_topic']."'>".$row4['tytul']."</a><br />".$row4['podtytul']."</td><td>";
  23.  
  24. $query8 = "SELECT * FROM forum_post WHERE id_forum_topic = '".$row4['id_forum_topic']."'";
  25. $result8 = mysqli_query($mysql, $query8) or die('zapytanie: '.$query8.'---blad:'.mysqli_error($mysql));
  26. $liczba_postow = mysqli_num_rows($result8);
  27. echo "".$liczba_postow."</td><td>";
  28.  
  29. $query5 = "SELECT nick FROM forum_uzytkownicy WHERE id_forum_user = '".$row4['id_forum_user']."'";
  30. $result5 = mysqli_query($mysql, $query5) or die('zapytanie: '.$query5.'---blad:'.mysqli_error($mysql));
  31. while ($row5 = mysqli_fetch_assoc($result5))
  32. {
  33. echo "".$row5['nick']."</td><td>";
  34. }
  35.  
  36. $query6 = "SELECT data_powstania, id_forum_user FROM forum_post WHERE id_forum_topic =
     '"
    .$row4['id_forum_topic']."' ORDER BY data_powstania DESC LIMIT 0,1";
  37. $result6 = mysqli_query($mysql, $query6) or die('zapytanie: '.$query6.'---blad:'.mysqli_error($mysql));
  38. while ($row6 = mysqli_fetch_assoc($result6))
  39. {
  40. $czasa = explode(', ', $row6['data_powstania']);
  41. $czasday = $czasa['0'];
  42. $czastime = $czasa['1'];
  43. $czasa1 = explode('-', $czasa['0']);
  44. $czasa2 = explode(':', $czasa['1']);
  45. $czasunixhour = mktime($czasa2['0'], $czasa2['1']);
  46. if($czasday < date('Y-m-d'))
  47. {
  48. echo "".$row6['data_powstania']."<br />";
  49. }
  50. elseif($czasday = date('Y-m-d'))
  51. {
  52. $roznicza = time() - $czasunixhour;
  53. $roznicza = floor($roznicza / 60);
  54. if($roznicza < 60)
  55. {
  56. echo "".$roznicza." minut temu<br />";
  57. }
  58. else
  59. {
  60. echo "Dzisiaj o ".$czastime."<br />";
  61. }
  62. }
  63. $query7 = "SELECT nick FROM forum_uzytkownicy WHERE id_forum_user = '".$row6['id_forum_user']."'";
  64. $result7 = mysqli_query($mysql, $query7) or die('zapytanie: '.$query7.'---blad:'.mysqli_error($mysql));
  65. while ($row7 = mysqli_fetch_assoc($result7))
  66. {
  67. echo "".$row7['nick']."</td>";
  68. }
  69. }
  70. echo "</tr>\n";
  71. }
  72. echo "</table>\n";
  73. }
  74. ?>
JaRoPHP
Cytat(henio @ 23.12.2007, 17:41:04 ) *
Tylko że obecnie wyświetla mi te tematy tyle razy ile jest postów.
Klauzula GROUP BY powinna temu przeciwdziałać.
Możesz dać zapytania tworzące obie tabele, oraz przykładowe wstawiające dane? Wtedy łatwiej będzie znaleźć problem.
henio
Co masz na myśli? Mam jeszcze raz stworzyć te tabele? Mam wstawić przykładowe dane do tych tabel?
JaRoPHP
Cytat(henio @ 23.12.2007, 21:50:54 ) *
Co masz na myśli?

Aby forumowicze (w tym i ja smile.gif) mogli przetestować Twój kod - wrzuć na forum zapytanie tworzące te dwie tabele, oraz zapytania wstawiające przykładowe dane.
Jak wspomniałem - według mnie, wszystko powinno działać, na moich danych działało, ale może w tabelach masz jeszcze coś, czego ja nie uwzględniłem...
henio
Cytat(JaRoPHP @ 24.12.2007, 11:04:38 ) *
Aby forumowicze (w tym i ja smile.gif) mogli przetestować Twój kod - wrzuć na forum zapytanie tworzące te dwie tabele, oraz zapytania wstawiające przykładowe dane.
Jak wspomniałem - według mnie, wszystko powinno działać, na moich danych działało, ale może w tabelach masz jeszcze coś, czego ja nie uwzględniłem...

Ok.

  1. CREATE TABLE forum_topic (id_forum_topic INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, tytul VARCHAR(25) NOT NULL, podtytul VARCHAR(65), id_forum_user INTEGER NOT NULL, id_forum_dzial INTEGER NOT NULL, id_forum_watek INTEGER NOT NULL, data_powstania VARCHAR(18) NOT NULL);
  2.  
  3. CREATE TABLE forum_post (id_forum_post INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, tytul VARCHAR(25), tresc TEXT NOT NULL, data_powstania VARCHAR(18) NOT NULL, id_forum_user INTEGER NOT NULL, id_forum_dzial INTEGER NOT NULL, id_forum_watek INTEGER NOT NULL, id_forum_topic INTEGER NOT NULL);
  4.  
  5. INSERT INTO forum_topic (id_forum_topic, tytul, podtytul, id_forum_user, id_forum_dzial, id_forum_watek, data_powstania) VALUES (1, 'Tytuł topica', 'Ble ble', 1, 1, 1, '2007-12-24, 12:45');
  6.  
  7. INSERT INTO forum_topic (id_forum_topic, tytul, podtytul, id_forum_user, id_forum_dzial, id_forum_watek, data_powstania) VALUES (2, 'Tytuł topica2', 'Ble ble', 1, 1, 1, '2007-12-24, 13:45');
  8.  
  9. INSERT INTO forum_post (id_forum_post, tytul, tresc, data_powstania, id_forum_user, id_forum_dzial, id_forum_watek, id_forum_topic) VALUES (1, 'Tytuł postu', 'Ble ble', '2007-12-24, 13:47', 1, 1, 1, 1);
  10.  
  11. INSERT INTO forum_post (id_forum_post, tytul, tresc, data_powstania, id_forum_user, id_forum_dzial, id_forum_watek, id_forum_topic) VALUES (2, 'Tytul postu2', 'Ble ble', '2007-12-24, 13:48', 1, 1, 1, 1);
  12.  
  13. INSERT INTO forum_post (id_forum_post, tytul, tresc, data_powstania, id_forum_user, id_forum_dzial, id_forum_watek, id_forum_topic) VALUES (3, 'Tytul postu3', 'Ble ble', '2007-12-24, 13:49', 1, 1, 1, 2);
  14.  
  15. INSERT INTO forum_post (id_forum_post, tytul, tresc, data_powstania, id_forum_user, id_forum_dzial, id_forum_watek, id_forum_topic) VALUES (4, 'Tytul postu4', 'Ble ble', '2007-12-24, 13:50', 1, 1, 1, 2);
JaRoPHP
  1. SELECT t.id_forum_topic, t.tytul, t.podtytul, t.id_forum_user, max(p.data_powstania)
  2. FROM forum_topic AS t
  3. JOIN forum_post AS p ON (p.id_forum_topic = t.id_forum_topic)
  4. WHERE t.id_forum_dzial = 1 AND t.id_forum_watek=1
  5. GROUP BY p.id_forum_topic
  6. ORDER BY max(p.data_powstania) DESC
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.