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")."');");
}
takhle hodíš všechny najednou a nemusíš kontrolovat jestli už tam jsou bo ne, protože to za tebe udělá SQL
ForestCZE
Profil
Ale mně šlo o to, aby to při RANDu nezapsalo už existující IDéčka.
Micruss
Profil
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  
To jestli jich bylo alespoň pět poznáš podle affected rows.
ForestCZE
Profil
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
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
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
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
juriad:

To having tam[#5] být asi nemá.
juriad
Profil
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.

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: