Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MYSQL] ORDER BY RAND
Hpsi
post
Post #1





Grupa: Zarejestrowani
Postów: 483
Pomógł: 50
Dołączył: 15.03.2005
Skąd: Poznań

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


Witam, jak wszyscy wiedza order by rand() jest złe, ssie etc smile.gif

Ale mam pewien problem z prostym zapytaniem gdyz musze je zoptymalizować a przez warunek where cos like %cos% mi pomysly sie konczą.

Zapytanko:
  1. SELECT title,description,url FROM cncat_main WHERE description LIKE '%meble%' ORDER BY rand() LIMIT 10

Pierwszą moją myślą było zeby zliczyć max id i wylosowac 50 cyfr dodać je w warunku where id in ( liczby) lecz to nie zdaje egzaminu przez warunek WHERE descriotion like %meble% ...
Ma ktoś jakiś pomysł jak to rozwiązać optymalnie w miare (tabela ma ponad 30k rekrdów ... )

Ten post edytował Hpsi 26.07.2011, 11:47:42


--------------------
Daiquiri: T1 = (dx/dt * s)^hpsi
Daiquiri: gdzie T1 - Twój czas przybycia na miejsce, dx/dt - prędkość, s droga
Daiquiri: brb trzeba by to poprawić T1 - Czas jaki Ci to zajmie
Daiquiri: Zatem T - czas dotarcia p T1 + T2 gdzie T2 = aktualny czas

===
po prostu kocham ją :D haha
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
peter13135
post
Post #2





Grupa: Zarejestrowani
Postów: 1 447
Pomógł: 191
Dołączył: 26.03.2008

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


nie wiem czy będzie bardziej optymalnie, ale jakiś pomysł mam wink.gif

  1. SELECT id FROM cncat_main WHERE description LIKE '%meble%'

wszystkie idki dajesz do tablicy $idki.
  1. $nowe_idki = array_rand($idki, 10);


edit://
potem (pseudokod) :
  1. SELECT * FROM cncat_main WHERE id IN( implode(',' $nowe_idki) )


Ten post edytował peter13135 26.07.2011, 12:15:47


--------------------
:)
Go to the top of the page
+Quote Post
thek
post
Post #3





Grupa: Moderatorzy
Postów: 4 362
Pomógł: 714
Dołączył: 12.02.2009
Skąd: Jak się położę tak leżę :D




Ma to być tylko na poziomie bazy czy nie? Jeśli nie to zrób to w stylu... Zapytanie ale wyciągaj jedynie id i wrzucaj do tablicy, którą potem shuffle'niesz, wyciągniesz x liczb i poślesz już do bazy zapytanie z wybranymi id. Tu zrobiłem dla funkcji mysql_query, ale przerobienie tego na PDO to żaden problem smile.gif
  1. $sql = 'SELECT id FROM cncat_main WHERE description LIKE \'%meble%\'';
  2. $id = array();
  3. $count = 10;
  4. $res = mysql_query( $sql );
  5. if( $res && mysql_num_rows( $res ) > 0 ) {
  6. while( $row = mysql_fetch_assoc($res) ) {
  7. $id[] = $row['id'];
  8. }
  9. shuffle( $id );
  10. $sql = 'SELECT title,description,url FROM cncat_main WHERE id IN ('.implode( ',', array_slice($id, 0, $count) ).')';
  11. //lub to co podał kolega wyżej :)
  12. $sql = 'SELECT title,description,url FROM cncat_main WHERE id IN ('.implode( ',', array_rand($id, $count) ).')';
  13. } else {
  14. echo 'Nie ma rekordów';
  15. }
Oczywiście echo tylko dla przykładu.
Powód edycji: [thek]: zmieniłem ciutkę dodając opcjonalnie array_rand kolegi wyżej


--------------------
Najpierw był manual... Jeśli tam nie zawarto słów mądrości to zapytaj wszechwiedzącego Google zadając mu własciwe pytania. A jeśli i on milczy to Twój problem nie istnieje :D
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: 20.08.2025 - 07:55