| Autor | Zpráva | ||
|---|---|---|---|
| joe Profil |
#1 · Zasláno: 23. 6. 2008, 04:21:38
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 * |
#2 · Zasláno: 23. 6. 2008, 08:51:15
Co si ukládat prohrané duely u konkrétního uživatele (session) do nějaké pomocné tabulky?
|
||
| joe Profil |
#3 · Zasláno: 23. 6. 2008, 13:17:20
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? |
||
|
Časová prodleva: 7 dní
|
|||
| joe Profil |
#4 · Zasláno: 30. 6. 2008, 03:03:08
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 * |
#5 · Zasláno: 1. 7. 2008, 14:12:52
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 |
#6 · Zasláno: 1. 7. 2008, 14:32:10
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 |
#7 · Zasláno: 1. 7. 2008, 15:54:05
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 |
#8 · Zasláno: 2. 7. 2008, 02:24:47 · Upravil/a: joe
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 * |
#9 · Zasláno: 2. 7. 2008, 22:39:16
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 |
#10 · Zasláno: 2. 7. 2008, 23:00:25
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 * |
#11 · Zasláno: 2. 7. 2008, 23:39:28
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 |
#12 · Zasláno: 4. 7. 2008, 12:09:44 · Upravil/a: joe
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. |
||
|
Časová prodleva: 18 let
|
|||
0