Autor Zpráva
joe
Profil
Prosím, nevěděl by někdo o lepším (pokud existuje) řešením na duel fotek?
Tzn., jsou dvě fotky, na jednu kliknu a ta druhá se vymění za jinou. Ale tak, aby ty minulé (prohrané) se s tou vyhranou už nezobrazily znovu.

Nenapadlo mě nic jiného, než id prohraných fotek ukládat a pak podmínku postupně dělat složitější (přidávat prohrané id):
SELECT ... WHERE id <> 10 AND id <> 11 AND id <> 12 ... id <> N

nebo
SELECT ... WHERE id NOT IN (10, 11, 12, ..., N)


Přitom těch id může být hodně. Tak by mě zajímalo, jestli není nějaký lepší způsob nebo který z těchto dvou je lepší, rychlejší...?

Děkuju za pomoc ;-)
Kajman_
Profil *
Co si ukládat prohrané duely u konkrétního uživatele (session) do nějaké pomocné tabulky?
joe
Profil
Kajman_
Moc si to neumím představit. Tabulka duel_result by mohla mít strukturu:

uzivatel | hodnoceny_uzivatel | stav | datum

(ve stavu by bylo jestli vyhrál nebo prohrál)

Pak ale nevím jak na podmínku v tom dotazu z prvního příspěvku. Možná by to šlo nějakým způsobem - zjednodušeně (nevím jestli by to takto fungovalo):

SELECT ... WHERE NOT IN (SELECT id FROM duel_result WHERE ...)

Ale pak, nebylo by to to samé jako to druhé řešení z prvního příspěvku. Nebo jste to myslel jinak?
joe
Profil
Kajman_
A když bych to chtěl natrvalo, aby se spolu v duelu u toho hodnotícího už nikdy nemohly fotky setkat, tak pak asi jiné řešení není nebo vás napadá nějaké?

Případně věděl by někdo jak to udělat lépe?
Kajman_
Profil *
Když si budete ukládat která fotka s kterou soutěžila, tak by neměl být problém do toho where zakomponovat podmínku, že nechcete vytáhnout soupeře, který už byl.
joe
Profil
Kajman_
To by nebyl problém vytvořit pak takový dotaz, ale jde o to, jestli nebude například trvat dlouho než se vybere další náhodná fotka, protože po čase tam může být plno fotek, které by už neměly spolu být...
A jak by dotaz podle vás měl vypadat? Nebízí se řešení poddotazy nebo jednotlivými dotazy tak, že bych napřed vybral fotky a výsledek přidal do podmínky. Co by bylo podle vás rychlejší?
Díky.
Joker
Profil
joe
Tak úplně "čistě" by to asi měly být dvě tabulky:
tabulka "výsledky duelů":
id duelu, datum, id vítěze
tabulka "účastníci duelů":
id duelu, id účastníka

Potom se dá k výsledku dobrat jediným dotazem. Sice to bude JOIN přes tři tabulky, ale podle mého názoru by s rychlostí neměl být problém (bude to JOIN s podmínkou a spojená tabulka bude obsahovat vždycky méně řádků, než je počet fotek).
joe
Profil
Kajman_
Joker
A co říkáte na takové řešení?

Tabulky:

uzivatele
id | foto_id | nick | ...

duely
uzivatel_id | vitez_id | prohrany_id | datumacas

(uzivatel_id - tj. ten, kdo klikal)

a dotaz by byl

SELECT
u.id, u.nick, f.foto
FROM uzivatele u
JOIN fotky f
ON f.uzivatel_id = u.id
JOIN duely d ON
(d.vitez_id <> u.id AND d.prohrany_id <> 20)
AND
(d.vitez_id <> 20 AND d.prohrany_id <> u.id)
WHERE d.user_id = 10

---

20... id uzivatele, ktery treba uz jednou vyhral (prave k nemu se vybira souper)
10... id prihlaseneho uzivatele, ktery rozhoduje duel

Do dotazu by musely pribyt jeste dalsi podminky, takto je zjednodušený...

---

Taky by to tak fungovalo? Nejsem si teď jistý jestli mezi závorky by nemělo být OR.
Kajman_
Profil *
nad tou strukturou by ten dotaz spíše byl něco jako

select * from uzivatele u
where u.foto_id not in (select prohrany_id from duely where uzivatel_id=10 and vitez_id=20)
and u.foto_id not in (select vitez_id from duely where uzivatel_id=10 and prohrany_id=20)
joe
Profil
Kajman_
Pravda, ten co jsem napsal by fungoval asi jen v opačném případě, když bych chtěl vypsat ty, co už byly (kdyby místo <> bylo = )
Ale teď k tomu dotazu od vás, to je právě to nad čím přemýšlím, protože data v tabulce budou nabývat a tak jestli by to netrvalo později déle.

Dotaz bych ještě upravil na:

select * from uzivatele u
where u.foto_id not in (select prohrany_id from duely where uzivatel_id=10 and vitez_id=20)
and u.foto_id not in (select vitez_id from duely where uzivatel_id=10 and prohrany_id=20) order by rand() limit 1

ale pokud bude v závorkách plno id, tak může trvat dlouho vybrat náhodně jiné id.

Možná se obávám zbytečně, holt s tím nemám ještě tolik zkušeností a raději si nechám poradit od větších odborníků :-)
Kajman_
Profil *
Když tam budou oba indexy (uzivatel_id,vitez_id,prohrany_id) a (uzivatel_id,prohrany_id,vitez_id) tak to snad pomalé nebude. Bez takovéto tabulky to chování, které chcete, těžko uděláte.

Jestli máte čas, zkuste si vygenerovat nějaká data do těch tabulek v počtech, které očekáváte. Tam se uvidí, jestli to bude svižné.
joe
Profil
Kajman_
Díky za radu, zkusil jsem to a myslím, že se bez toho zatím obejdu, i když v budoucnu to může být už složité to nasadit, kdyby se měnila struktura.
Zkoušel jsem plno možností, ale všechny mi schazovaly Apache při 10.000 uživatelích v db, nevím co kde je/bylo špatně, ale dotazy mi přišly správné. (indexy mám).
Jinak teď to mám „ošetřené“ tak, že v tabulce duely mám jeden unikátní index na třech sloupcích. Tedy nejde vložit to samé hlasování znovu a při chybě nic nedělám.

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