Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mysql - losowe wybieranie rekordów najpierw a potem pozostałe
Pozycjonowanie i Optymalizacja > Projektowanie stron > PHP i MySQL
met
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?
met
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");
Mion
@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 " chatownik.gif
met
CYTAT(Mion @ 6.02.10 - 15:33) *
@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 " chatownik.gif


próbowałem z " na wszystkie sposoby i nic, napisałem że w kewstii sql jestem laikiem...
Mion
Zatem pozostaje Ci dzieł dział zlecenia, lub spróbuj tak:
KOD
$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());
wink.gif
Maximus Marius
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

met
witam, fajnie dzięki smile.gif

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:


KOD
$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 placze.GIF
Mion
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....
met
CYTAT(Mion @ 6.02.10 - 23:00) *
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: http://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
Mion
@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.

websign
CYTAT(met @ 6.02.10 - 15:05) *
$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ł...
slawek22
CYTAT
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? biggrin.gif "Przecież to proste" tongue.gif

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.
sorrow
Nie ten topic tongue.gif
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-2012 Invision Power Services, Inc.