Skocz do zawartości

Mysql - losowe wybieranie rekordów najpierw a potem pozostałe


met

Rekomendowane odpowiedzi

witam, mam w bazie 50 ofert, w tym 10 jest promowana a 40 nie, chciałbym aby z bazy pobierane były najpierw oferty promowane w losowej kolejności, a potem wszystkie pozostałe wg. np id, żeby wylosować losowowo 10 promowanych komenda jest:

$zapytanie = mysql_query("SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 1 ORDER by rand() LIMIT 10");

a do pozostałych:

$zapytanie = mysql_query("SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 0 ORDER by id DESC LIMIT 40");

teraz pytanie jak to połączyć w jedno polecenie?

Odnośnik do komentarza
Udostępnij na innych stronach

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

połączyłem UNION ale niestety Parse error: syntax error,

dodam że moja znajomość sql jest zerowa...

$zapytanie = mysql_query("SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 1 ORDER by rand() LIMIT 10") UNION ("SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 0 ORDER by id DESC LIMIT 40");

Odnośnik do komentarza
Udostępnij na innych stronach

@połączyłem UNION ale niestety Parse error: syntax error,

No i co teraz ? Parser error jest błędem składni, a nie komunikatem błędu serwera bazodanowego.

Dla ułatwienia dodam, że masz problem w zapytaniu z " :)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

@połączyłem UNION ale niestety Parse error: syntax error,

No i co teraz ? Parser error jest błędem składni, a nie komunikatem błędu serwera bazodanowego.

Dla ułatwienia dodam, że masz problem w zapytaniu z " ;)

próbowałem z " na wszystkie sposoby i nic, napisałem że w kewstii sql jestem laikiem...

Odnośnik do komentarza
Udostępnij na innych stronach

Zatem pozostaje Ci dzieł dział zlecenia, lub spróbuj tak:

$zapytanie = mysql_query("(SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 1 ORDER by rand() LIMIT 10) UNION (SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 0 ORDER by id DESC LIMIT 40)") or die(mysql_error());

;)

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

bez znajomości czytania raczej w życiu bedzie cięzko, a dokumentacja jest po to aby ją czytać.

w skrócie

(select .... )

UNION

(select ....)

Wiec nie robisz dwóch zapytań tylko jedno które sumuje dwa zbiory, oczywiście zapytania powinny mieć identyczne kolumny

Odnośnik do komentarza
Udostępnij na innych stronach

witam, fajnie dzięki ;)

Działa ok, natomiast problem pojawił się podczas paginacji... postaram się opisać problem najlepiej jak to możliwe, mianowicie załóżmy że w skrypcie na jednej stronie wyświetla się max 10 ogłoszeń - zmienna ($ogloszen_na_strone). Pierwsze np. 7 (promowane=1) z tych dziesięciu muszą pojawić sie na początku pierwszej strony w kolejności losowej, natomiast reszta ofert wg id. Część skryptu za to odpowiedzialna wygląda tak:

$ogloszen_na_strone = 10;

if(isset($_GET['strona'])) //wyświetlanie bieżącej strony
$strona = $_GET['strona'];
else
$strona = 0;

$zapytanie = mysql_query("SELECT id FROM oferty WHERE aktywna = 1");
$ile = mysql_num_rows($zapytanie); //liczba aktywnych ofert np. 90

$zapytanie = mysql_query("SELECT * FROM oferty WHERE aktywna = 1 ORDER by promowana DESC, id DESC LIMIT ".($strona*$ogloszen_na_strone).",$ogloszen_na_strone"); //paginacja - przy tym zapytaniu jest prawie ok, bo promowane (które mają dodatkowo opcje promowana=1 w przeciwieństwie do zwykłych promowana=0) są wyświetlane jako pierwsze ale nie są w kolejności losowej tylko wg id, w tym miejscu pasowałoby ustawić losowe dla promowanych. 

$stron = $ile / $ogloszen_na_strone; //wychodzi na to że przy 90 ofertach będzie 9 stron

błagam fachowców o pomoc ;)

Odnośnik do komentarza
Udostępnij na innych stronach

Ty nie oczekujesz pomocy jako takiej tylko gotowego rozwiązania!

Gotowe rozwiązania znajdziesz w dziale zlecenia jeśli nie chcesz się uczyć programowania w PHP.

Darmowe rozwiązania znajdziesz w google pod zapytaniem:

php paginacja

php pagination

php pagination class

itd....

Reszta należny do Ciebie....

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

Ty nie oczekujesz pomocy jako takiej tylko gotowego rozwiązania!

Gotowe rozwiązania znajdziesz w dziale zlecenia jeśli nie chcesz się uczyć programowania w PHP.

Darmowe rozwiązania znajdziesz w google pod zapytaniem:

php paginacja

php pagination

php pagination class

itd....

Reszta należny do Ciebie....

tak, poszukuje gotowego rozwiązania - czyli mam zapytać w dziale: https://www.forum.optymalizacja.com/index.php?showforum=20 ??

bo nie widze tam żadnych pozycji odnoście mysql czy php - a raczej odnośnie pozycjonowania. Mogę to oczywiście komuś zlecić i zapłacić za zmiane polecenia select na takie jakie by było prawdidłowe do powyższego skryptu - nie ma problemu.

A na nauke php (a raczej sql) to już niestety za późno

Odnośnik do komentarza
Udostępnij na innych stronach

@zlecić i zapłacić za zmiane polecenia select ...

Gotowe rozwiązanie paginacji na pewno nie będzie polegać na zmianie twojego zapytania, ale implementacji całości.

@czyli mam zapytać w dziale...

Tak, możesz tam zapytać.

@A na nauke php (a raczej sql) to już niestety za późno

Skoro chcesz korzystać z tej technologi server-side bez własnych implementacji, bo jak napisałeś "na naukę jest za późno" pozostają tylko zlecenia.

HTTP 200 usługi IT -> Dariusz Janicki | Realizacja serwisów www oraz oprogramowania w PHP / C# / Golang / Node.js / MySQL/ Laravel
Komory normobaryczne - normobaria.tech Wykonawca montażu i instalacji komory normobarii

Odnośnik do komentarza
Udostępnij na innych stronach

$zapytanie = mysql_query("SELECT * FROM oferty WHERE aktywna = 1 AND promowana = 1 ORDER by rand() LIMIT 10");

Jak będziesz miał dużo rekordów w bazie to tym zapytaniem będziesz zabijać serwer, przy małej ilości rekordów się sprawdzi, ale przy większej ORDER by rand() to nie najlepszy pomysł...

Skuteczne pozycjonowanie stron www | Nowe randki internetowe

Odnośnik do komentarza
Udostępnij na innych stronach

zlecić i zapłacić za zmiane polecenia select

Wiesz Mion, jeśli wszędzie pokemony piszą, że witrynę można mieć za parę stówek to ile za zrobienie random i paginacji? 5 złotych? ;) "Przecież to proste" ;)

Co do rozwiązania, najpierw trzeba rozbić te UNION na 2 oddzielne selecty. Znaczy lepiej tak zrobić jeśli nie rozumiesz jak działa union. Jeśli nie wiesz jak zrobić bez random to zrób cache. Albo najpierw wybierz przedział dajmy na to 1000 rekordów z bazy (tylko musi być ciągły - bo dysk zajedziesz, dzielisz ilość rekordów przez 1000 a potem wybierasz OFFSET x*1000 limit (x+1)*1000) układasz te 1000 BY RANDOM (a to już szybkie). Jest jeszcze trzecia kwerenda do paginacji, ale to już prosta sprawa.

Odnośnik do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...

Powiadomienie o plikach cookie

Umieściliśmy na Twoim urządzeniu pliki cookie, aby pomóc Ci usprawnić przeglądanie strony. Możesz dostosować ustawienia plików cookie, w przeciwnym wypadku zakładamy, że wyrażasz na to zgodę. Warunki użytkowania Polityka prywatności