Autor | Zpráva | ||
---|---|---|---|
ForestCZE Profil |
Ahoj, potřeboval bych pomoct. Mám v tabulce 10 uživatelů a náhodně vybírám 5 uživatelů a ukládám si jejich ID:
$dotaz = mysql_query("SELECT uid FROM users WHERE uid!='".$_SESSION["uid"]."' ORDER BY RAND() LIMIT 5"); while($data = mysql_fetch_assoc($dotaz)) { $_POST["uid"] = $data["uid"]; } Abych zamezil výběru uživatele, který je přihlášen, mám tam tedy: WHERE uid!='".$_SESSION["uid"]."' Potom ta vylosovaná ID zapíšu do jiné tabulky s dnešním datumem, takže do toho cyklusu while přidám: mysql_query("INSERT INTO info (id, datum) VALUES('".$_POST["uid"]."', '".Date("Y-m-d")."');"); A já bych potřeboval, když při tom losovaní vyjde 5 čísel, aby to zkontrolovalo, jestli už nějaké z 5 čísel není v tabulce info a pokud by bylo, aby to vylosovalo jiného uživatele s jiným ID. A kdyby už to nemělo z čeho losovat, aby to upozornilo uživatele. Díky moc předem za každou pomoc :) |
||
Micruss Profil |
a proč si je neukládáš ty údaje do nějakýho pole a potom je všecky hodíš do databáze?
$arr = array(); while($data = mysql_fetch_assoc($dotaz)) { $arr[] = $data["uid"]; } foreach($arr as $data) { mysql_query("INSERT INTO info (id, datum) VALUES('$data', '".Date("Y-m-d")."');"); } |
||
ForestCZE Profil |
Ale mně šlo o to, aby to při RANDu nezapsalo už existující IDéčka.
|
||
Micruss Profil |
#4 · Zasláno: 8. 10. 2013, 21:20:10
tak jedině vytáhnout data z tabulky info a udělat podmínky, pokud tam nějaký data sou tak udělat sql !='$id'... a pak order by rand()
|
||
juriad Profil |
Nefungovalo by náhodou toto (čistě jen jako jediný dotaz do databáze)? Střílím od boku.
INSERT INTO info (id, datum) SELECT uid, Now() FROM users LEFT JOIN info ON users.uid = info.id WHERE info.id IS NULL AND uid != $myuid # HAVING Count(*) >= 5 # toto byl zoufalý pokus ORDER BY Rand() LIMIT 5 |
||
ForestCZE Profil |
#6 · Zasláno: 8. 10. 2013, 21:39:01
juriad:
Připojování tabulek jsem ještě nezkoušel, tak jsem z toho překvapen a po pravdě se v tom nevyznám ... |
||
ForestCZE Profil |
Tak jsem prostudoval LEFT JOIN a vyplodil jsem toto:
SELECT uid, id FROM users LEFT JOIN info ON users.uid=info.id WHERE uid!='2' AND uid!=id ORDER BY RAND() LIMIT 5; Vyhodí mi to nulový výsledek. Co mám špatně? xD |
||
Alphard Profil |
#8 · Zasláno: 8. 10. 2013, 23:15:46
Nejde náhodou podmínka
uid!=id přímo proti spojovací podmínce users.uid=info.id .
Ale juriad vám to dodal komletní, snad to ani nemusíte měnit. |
||
ForestCZE Profil |
#9 · Zasláno: 8. 10. 2013, 23:31:55
Alphard:
„Nejde náhodou podmínka uid!=id přímo proti spojovací podmínce users.uid=info.id.“ Jojo, to nejspíš jo :-D „Ale juriad vám to dodal komletní, snad to ani nemusíte měnit.“ Já bych to chtěl pochopit a ne zkopírovat. Alphard: SELECT uid, id FROM users LEFT JOIN info ON users.uid=info.id WHERE uid!='2' ORDER BY RAND() LIMIT 5; Teď to tedy vybírá 5 náhodných IDéček, ale vybírá to i IDéčka, která už v tabulce info jsou. Jak ten příkaz mám upravit prosím? |
||
Alphard Profil |
#10 · Zasláno: 8. 10. 2013, 23:43:54
Od toho tam je to
info.id IS NULL . Když v druhé tabulce záznam neexistuje, použijete se null a podle toho se pak filtruje.
|
||
ForestCZE Profil |
Už mi to funguje, jak potřebuji. Díky moc všem, co mi pomohli :-)
|
||
Kajman Profil |
#12 · Zasláno: 9. 10. 2013, 09:08:10
juriad:
To having tam[#5] být asi nemá. |
||
juriad Profil |
#13 · Zasláno: 9. 10. 2013, 10:15:49
Kajman:
Původně to tam mělo být; chtěl jsem tím simulovat podmínku na výběr alespoň pěti řádků: „A kdyby už to nemělo z čeho losovat, aby to upozornilo uživatele.“. Ale už jsem zjistil, že HAVING bez GROUP BY takto jednoduše nefunguje. Šlo by to vyřešit poddotazem. |
||
Časová prodleva: 11 let
|
0