Autor Zpráva
libis
Profil
Zdravím, potřebuju pomoct v sestavení mysql dotazu. Potřebuju z jedné mysql tabulky vytáhnout data a to takto: musí to být 12 záznamů, musí to být náhodně a musí 3x obsahovat faktor (kategorie = 12) a 3x (kategorie = 15) a 3x (kategorie = 18) a 3x - to je ten zbytek může být náhodně. Jak na to. Zatím to mám jen takto na těch náhodných 12 z jedné tabulky:

Select * From $tabulka_web_produkty ORDER BY RAND() LIMIT 12
ninja
Profil
SELECT * FROM tabulka_web_produkty WHERE kategorie=12 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie=15 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie=18 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie NOT IN (12,15,18) ORDER BY RAND() LIMIT 3
libis
Profil
Ok díky vyzkouším.
Kajman_
Profil *
Pokud v tom zbytku mají být i náhodně klidně z tech vybraných kategorií, tak asi dva dotazy
(select ... where kategorie = 12 ORDER BY RAND() LIMIT 3) 
union all
(select ... where kategorie = 15 ORDER BY RAND() LIMIT 3) 
union all
(select ... where kategorie = 18 ORDER BY RAND() LIMIT 3) 


Uložit si id, která to vytáhlo a položit druhý dotaz
select where id not in (seznam, id, co, uz, mam) ORDER BY RAND() LIMIT (12-pocet radku, co jsem ziskal v minulem dotaze)
libis
Profil
ninja:
Tak jsem to zkusil, ale hlásí to

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/home/www/boty-kabelky.cz/www/data/data_fce/fce_main_produkty.php on line 19

na řádku 19 mám klasický výpis tedy while($data_seznam_produktu=mysql_fetch_array($q_dotaz_seznam_produktu))

divný
PostCC
Profil
libis:
Jo, jenže ta funkce Mysql_Fetch_Array() očekává jako parametr MySQL resource - což zjevně nedostává. Tudíž předchozí volání MySQL_Query() se zřejmě nevydařilo podle představ. Zkuste před zmíněný řádek 19 přidat:

Echo MySQL_Error();
libis
Profil
Incorrect usage of UNION and ORDER BY
PostCC
Profil
libis:
Voila! Takže? Použít korektně ORDER BY :-)
Jak vlastně vypadá ten výsledný select?
ninja
Profil
libis: V mém příkladu nejsou závorky, použijte syntax jak psal Kajman_.
libis
Profil
Ten výsledný select mám takto:

SELECT * FROM tabulka_web_produkty WHERE kategorie=12 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie=15 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie=18 ORDER BY RAND() LIMIT 3
UNION
SELECT * FROM tabulka_web_produkty WHERE kategorie NOT IN (12,15,18) ORDER BY RAND() LIMIT 3


Z každé kategorie 3 položky (9 celkem) + poslední vybrat z celku (3) - dohromady 12 položek a meli by byýt nahodne.

Nevím tedy jak jinak pouzít v mysql dotazu rand?
PostCC
Profil
libis:
Tady fakt chybí jen ty závorky. ORDER BY a LIMIT se vztahují ke každému z těch subselectů zvlášť, proto je třeba závorkami "vymezit jejich platnost". Např.:

(SELECT * FROM tabulka_web_produkty WHERE kategorie=12 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie=15 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie=18 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie NOT IN (12,15,18) ORDER BY RAND() LIMIT 3)


Taky by možná bylo fajn nenačítat plný dataset (*), pokud potřebujete pouze některé sloupce.

Pokud chcete ta výsledná data ze všech subselectů ještě jednou náhodně seřadit, prostě na konec přidejte ORDER BY, který se - mimo závorky - bude vztahovat už k výsledku UNION selectu:

(SELECT * FROM tabulka_web_produkty WHERE kategorie=12 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie=15 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie=18 ORDER BY RAND() LIMIT 3)
UNION
(SELECT * FROM tabulka_web_produkty WHERE kategorie NOT IN (12,15,18) ORDER BY RAND() LIMIT 3)
ORDER BY RAND()
libis
Profil
Super, klape to!! Jasně, načítat celý dataset nebudu, to tam mam jen na zkoušku, každopádně díky moc!! Jste borci!

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0