Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP + MySQL] Sortowanie danych pobranych z bazy danych
henio
post
Post #1





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
JaRoPHP
post
Post #2





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


@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...


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #3





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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.
Go to the top of the page
+Quote Post
webdice
post
Post #4


Developer


Grupa: Moderatorzy
Postów: 3 045
Pomógł: 290
Dołączył: 20.01.2007




Nie chce mi się analizować tego kodu, sortowanie możesz uzyskać poprzez zapytanie:

  1. SELECT * FROM `tabela` ORDER BY `data` DESC
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #5





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


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).


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #6





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #7





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


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


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #8





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #9





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


Składnia zapytania SELECT.

Jednym słowem, WHERE ma być przed GROUP BY


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #10





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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. ?>
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #11





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


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.


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #12





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


Co masz na myśli? Mam jeszcze raz stworzyć te tabele? Mam wstawić przykładowe dane do tych tabel?
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #13





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


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...


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post
henio
post
Post #14





Grupa: Zarejestrowani
Postów: 237
Pomógł: 1
Dołączył: 15.10.2004
Skąd: Lublin

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


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);
Go to the top of the page
+Quote Post
JaRoPHP
post
Post #15





Grupa: Zarejestrowani
Postów: 675
Pomógł: 15
Dołączył: 7.11.2004
Skąd: Katowice

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


  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


--------------------
Kto pyta, nie błądzi...
Kto zbłądził, ten pyta...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 11:26