Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] SORT BY dla dwóch wartości nie działa
Forum PHP.pl > Forum > Przedszkole
Manfred
Witam.
Piszę skrypt, w którym wyniki będą wyświetlane w kolejności
1. Wg. id (DESC)
2. A następnie wg. typu.

  1. SELECT * FROM $tableName ORDER BY id DESC LIMIT $start, $limit


Działa jak należy.
Ale gdy dodam, aby sortował jeszcze wg typu, to nie działa

  1. SELECT * FROM $tableName ORDER BY id DESC, type ASC LIMIT $start, $limit


Kolumna "type" wartości 0 i 1.
Czyli w tym konkretnym wypadku chciałbym aby dane były wyswietlane w kolejnosci od najnowszego id, a później te z type = 1.
darko
To raczej
(...), type DESC
Manfred
@darko
tak, przepraszam za błąd. Tyle, że takie kody też nie działa:
  1. SELECT * FROM $tableName ORDER BY id DESC, type DESC LIMIT $start, $limit

  1. SELECT * FROM $tableName ORDER BY id, type DESC LIMIT $start, $limit
darko
Pomiędzy order i limit spróbuj dodać jeszcze group by id, powinno działać.
Manfred
Gdzie konkretnie? Próbowałem wieelu kombinacji ale nie wychodziło
darko
  1. SELECT * FROM $tableName ORDER BY id DESC, type DESC GROUP BY id LIMIT $start, $limit
Manfred
Niestety wyskakuje błąd:
Cytat
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in C:\xampp\htdocs\pnw\index.php on line 74
modern-web
Pomysl, a nie strzelaj...

SELECT * FROM $tableName ORDER BY id, type DESC GROUP BY id LIMIT $start, $limit

1. Czy dobrze zapisales zmienna $tableName?
2. DESC dajesz po id, type
3. Coś mi ten Twój "LIMIT" podejrzanie wyglada. Łatwiej by było gdybyś dał caly kod z tymi zmiennymi...
4. * zamien na nazwę kolumny winksmiley.jpg
mortus
Najlepiej po mysql_query(...) daj or die(mysql_error())
  1. mysql_query("ZAPYTANIE") or die(mysql_error());
Od razu dojdziesz, gdzie w zapytaniu masz błąd.

@modern-web Twoje zapytanie posortuje rekordy najpierw rosnąco po id, a później malejąco po type, jeżeli zadziała. DESC, czyli rodzaj sortowania możemy dać po każdej nazwie sortowanej kolumny.
Manfred
@mortus
Wyskoczyło:
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 'GROUP BY adv_id LIMIT 0, 4' at line 1
Przy kodzie jaki podał darko

kod:
  1. $tableName="adverts";
  2. $targetpage = "index.php";
  3. $limit = 4;
  4.  
  5. $query = "SELECT COUNT(*) as num FROM $tableName";
  6. $total_pages = mysql_fetch_array(mysql_query($query));
  7. $total_pages = $total_pages[num];
  8.  
  9. $stages = 3;
  10. $page = mysql_escape_string($_GET['page']);
  11. if($page){
  12. $start = ($page - 1) * $limit;
  13. }else{
  14. $start = 0;
  15. }
  16.  
  17. // Get page data
  18. $query1 = "SELECT * FROM $tableName ORDER BY adv_id DESC, adv_premium DESC GROUP BY adv_id LIMIT $start, $limit";
  19. $result = mysql_query($query1)
  20.  
  21.  
  22. // Initial page num setup
  23. if ($page == 0){$page = 1;}
  24. $prev = $page - 1;
  25. $next = $page + 1;
  26. $lastpage = ceil($total_pages/$limit);
  27. $LastPagem1 = $lastpage - 1;
  28.  
  29.  
  30. while($row = mysql_fetch_array($result))
  31. {
  32.  
  33. $adv_text_mini = substr($row['adv_text'], 0, $mini_text_length);
  34.  
  35. echo '<h2>';
  36. echo '<a href="';
  37. echo $row['adv_seoname'] . "," . $row['adv_id'];
  38. echo '.html';
  39. echo '">';
  40. echo $row['adv_name'];
  41. echo '</a>';
  42. echo '</h2>';
  43. echo '<p>';
  44. echo $adv_text_mini;
  45. echo '...';
  46. echo '</p>';
  47. echo '<p class=\"more\"><a href=';
  48. echo $row['adv_seoname'] . "," . $row['adv_id'];
  49. echo '.html';
  50. echo ' title=\"zobacz szczegóły\">więcej</a></p>';
  51. }


@modern-web
zamiana * na nazwe kolumny nic nie dała
darko
Ach, najpierw group by następnie order by czyli:
  1. $query1 = "SELECT * FROM $tableName GROUP BY adv_id ORDER BY adv_id DESC, adv_premium DESC LIMIT $start, $limit";
Manfred
@darko, teraz to już w ogóle wyświetla mi od najmniejszego id blink.gif
mortus
Przykład 1
  1. SELECT * FROM (SELECT * FROM adverts ORDER BY adv_id DESC LIMIT 0, 10) AS last_ten_adverts ORDER BY adv_premium DESC
Zapytanie wybierze nam 10 ostatnio dodanych reklam i posortuje je według adv_premium.
Przykład 2
  1. SELECT * FROM (SELECT * FROM adverts ORDER BY adv_id DESC) AS last_ten_adverts ORDER BY adv_premium DESC LIMIT 0, 10
To zapytanie najpierw posortuje nam reklamy począwszy od najnowszej do najstarszej, później według adv_premium, a na końcu ograniczy ich liczbę do 10. Zapytanie działa zupełnie inaczej niż zapytanie z przykładu 1.
Przykład 3
  1. SELECT * FROM adverts ORDER BY adv_premium DESC, adv_id DESC LIMIT 0, 10
Zapytanie to zadziała dokładnie tak samo, jak zapytanie z przykładu 2.

Różnica pomiędzy zapytaniem 1, a pozostałymi dwoma jest taka, że drugie zapytanie wybierze nam przede wszystkim te reklamy, które "zostały dodatkowo opłacone" (adv_premium=1) i nie muszą być one najnowsze. Zapytanie 1 wybiera nam natomiast zawsze 10 ostatnio dodanych reklam, a dopiero później sortuje je według priorytetu tych, które "zostały dodatkowo opłacone".

Zapytania przedstawione w poprzednich postach nie będą działać, ponieważ sortowanie klucza głównego ma bardzo wysoki priorytet i wymusza taką, a nie inną kolejność.
Manfred
@mortus, kawał dobrej roboty. Działa. Wielkie dzięki 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.