Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] SORT BY dla dwóch wartości nie działa
Manfred
post 5.04.2010, 21:15:08
Post #1





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 13)
darko
post 5.04.2010, 21:20:56
Post #2





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


To raczej
(...), type DESC


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Manfred
post 5.04.2010, 21:32:27
Post #3





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


@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
Go to the top of the page
+Quote Post
darko
post 5.04.2010, 21:51:43
Post #4





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


Pomiędzy order i limit spróbuj dodać jeszcze group by id, powinno działać.


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Manfred
post 5.04.2010, 21:58:58
Post #5





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


Gdzie konkretnie? Próbowałem wieelu kombinacji ale nie wychodziło
Go to the top of the page
+Quote Post
darko
post 5.04.2010, 22:00:13
Post #6





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Manfred
post 5.04.2010, 22:15:21
Post #7





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


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
Go to the top of the page
+Quote Post
modern-web
post 5.04.2010, 22:17:40
Post #8





Grupa: Zarejestrowani
Postów: 763
Pomógł: 117
Dołączył: 15.03.2010
Skąd: void

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


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


--------------------
Pomogłem? Kliknij `Pomógł`. To nic nie kosztuje, a mnie usatysfakcjonuje! ;)
Go to the top of the page
+Quote Post
mortus
post 5.04.2010, 23:04:42
Post #9





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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.
Go to the top of the page
+Quote Post
Manfred
post 5.04.2010, 23:33:12
Post #10





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


@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

Ten post edytował Manfred 5.04.2010, 23:34:44
Go to the top of the page
+Quote Post
darko
post 5.04.2010, 23:37:34
Post #11





Grupa: Zarejestrowani
Postów: 2 885
Pomógł: 463
Dołączył: 3.10.2009
Skąd: Wrocław

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


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";


--------------------
Nie pomagam na pw, tylko forum.
Go to the top of the page
+Quote Post
Manfred
post 5.04.2010, 23:59:04
Post #12





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


@darko, teraz to już w ogóle wyświetla mi od najmniejszego id blink.gif
Go to the top of the page
+Quote Post
mortus
post 6.04.2010, 06:38:07
Post #13





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

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


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ść.
Go to the top of the page
+Quote Post
Manfred
post 6.04.2010, 12:32:54
Post #14





Grupa: Zarejestrowani
Postów: 45
Pomógł: 0
Dołączył: 21.03.2005
Skąd: Olsztyn

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


@mortus, kawał dobrej roboty. Działa. Wielkie dzięki winksmiley.jpg
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 17:05