Autor | Zpráva | ||
---|---|---|---|
libis Profil |
#1 · Zasláno: 25. 8. 2010, 12:32:08
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 |
#2 · Zasláno: 25. 8. 2010, 12:51:03
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 |
#3 · Zasláno: 25. 8. 2010, 12:52:38
Ok díky vyzkouším.
|
||
Kajman_ Profil * |
#4 · Zasláno: 25. 8. 2010, 12:59:11
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 |
#5 · Zasláno: 25. 8. 2010, 14:38:45
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 |
#6 · Zasláno: 25. 8. 2010, 14:41:25
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 |
#7 · Zasláno: 25. 8. 2010, 14:45:48
Incorrect usage of UNION and ORDER BY
|
||
PostCC Profil |
#8 · Zasláno: 25. 8. 2010, 15:24:30
libis:
Voila! Takže? Použít korektně ORDER BY :-) Jak vlastně vypadá ten výsledný select? |
||
ninja Profil |
#9 · Zasláno: 25. 8. 2010, 15:32:25 · Upravil/a: ninja
libis: V mém příkladu nejsou závorky, použijte syntax jak psal Kajman_.
|
||
libis Profil |
#10 · Zasláno: 25. 8. 2010, 15:34:06
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 |
#11 · Zasláno: 25. 8. 2010, 15:39:46 · Upravil/a: PostCC
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 |
#12 · Zasláno: 25. 8. 2010, 15:42:23
Super, klape to!! Jasně, načítat celý dataset nebudu, to tam mam jen na zkoušku, každopádně díky moc!! Jste borci!
|
||
Časová prodleva: 14 let
|
0