Autor | Zpráva | ||
---|---|---|---|
Lonanek Profil |
#1 · Zasláno: 19. 1. 2016, 14:00:14
Dobrý den,
mám tabulku, která obsahuje tyto sloupce: id, polozka1, polozka2, duplicita Potřebuji efektivně vyhodnotit duplicitu v polozka1 a polozka2 a označit ji ve sloupci duplicita. Příklad: 1, 25, 20, 0 2, 25, 15, 0 3, 25, 20, 1 4, 20, 25, 1 5, 15, 25, 1 Tučné položky se musí po nalezení shody aktualizovat. Tabulka nesmí obsahovat neoznačenou duplicitu v případě shody obou položek v jakémkoli pořadí. Jak vytvořit nejjednodušeji a efektivně toto vyhodnocení? |
||
RastyAmateur Profil |
#2 · Zasláno: 19. 1. 2016, 14:08:32
Lonanek:
Moc to nechápu a trochu mě mate jedna věc - řádek s id 1 má stejné hodnoty ve sloupcích jako řádek s id 3, ale není označen jako duplicitní. Je to chyba, nebo jsem opravdu vůbec nepochopil tvůj cíl. |
||
juriad Profil |
UPDATE tabulka t2 JOIN tabulka t1 ON t2.id > t1.id AND (t1.polozka1 = t2.polozka1 AND t1.polozka2 = t2.polozka2 OR t1.polozka1 = t2.polozka2 AND t1.polozka2 = t2.polozka1) SET t2.duplicita = 1 Chceš nastavit duplicitu na 1 pro všechny řádky takové, že pro ně existuje řádek s nižším id a shodnými položkami (v libovolném pořádí). |
||
Lonanek Profil |
RastyAmateur:
„Je to chyba, nebo jsem opravdu vůbec nepochopil tvůj cíl.“ Není to chyba. První položka (id=1) není duplicitní, ale až ta druhá (id=3) je duplicitou. juriad: „Chceš nastavit duplicitu na 1 pro všechny řádky takové, že pro ně existuje řádek s nižším id a shodnými položkami (v libovolném pořádí).“ V podstatě ano. Pořadí je závislé na výkonu z další tabulky pro obě položky. Tedy první (nejvyšší výkon) není duplicitou, ale další shodné položky v obou sloupcích již duplicitou jsou bez ohledu na dosažený výkon. Snad jsem to popsal srozumitelně. Konkrétní dotaz pro výpis všech záznamů je: SELECT t1.id, d1.hrac hrac1, d2.hrac hrac2 FROM tabulka t1 LEFT JOIN tabulka2 d1 ON t1.termin1=d1.id_termin LEFT JOIN tabulka2 d2 ON t1.termin2=d2.id_termin WHERE d1.hrac is not null AND d2.hrac is not null ORDER BY d1.vykon + d2.vykon DESC Tedy bud sestavit komplikovaný SQL dotaz, nebo vyhodnotit jinak (php) Teď jsem si uvědomil, že jsem trochu mystifikoval při zadávání příkladu. Dneska mám asi kritický den :-) |
||
Keeehi Profil |
#5 · Zasláno: 19. 1. 2016, 16:52:41
Lonanek:
A co takhle do databáze duplicity vůbec nevkládat? Není to lepší řešení? |
||
Lonanek Profil |
#6 · Zasláno: 19. 1. 2016, 17:03:19
Domnívám se, že programově by to bylo složitější na kontroly existujících dvojic.
|
||
Keeehi Profil |
#7 · Zasláno: 19. 1. 2016, 17:21:30
Jak by to mohlo být složitější. Vždyť přece logicky může být kontrola předem nanejvýše stejně složitá jako kontrola po.
|
||
Lonanek Profil |
#8 · Zasláno: 19. 1. 2016, 17:35:59
Problém je v tom, že každý chce vidět své výkony i když se do konečného pořadí započítá jen ten jeho nejlepší...
Proto jsou v tabulce uloženy všechny dosažené výkony, současně se počet startujících využívá ke kontrole poplatků za start. |
||
Keeehi Profil |
#9 · Zasláno: 19. 1. 2016, 18:00:08
Lonanek:
Ale pokud jde opravdu o duplicitu, tak se tím přece žádná informace neztratí. Spíš se mi ale zdá, že jsi si tu databázi špatně navrhl a pokud tam ten duplikát není, tak nevíš, jak se k informaci dostat. Nadruhou stranu ti tam ten duplikát občas překáží. Řešením by tedy bylo to navrhnout správě a předělat, dokud je čas. |
||
Lonanek Profil |
Jde o rozšíření již existující funkcionality systému.
Doposud se vyhodnocovaly výsledky pouze jednotlivců, kde se jejich další výkony daly bez problémů "přeskakovat" ve výsledkové listině. Nyní se vyhodnocují dvojice a požadavek je aby jedna a tatáž dvojice měla pouze jeden platný výsledek bez ohledu na pořadí ve dvojici (tedy hráč s id 150 a hráč s id 100 zapsán jako 150, 100 === 100, 150). Do tabulky výsledků se vždy uvádí výkon každého jednotlivce, který je specifikován časem startu. Tabulka dvojic obsahuje id, id termínu prvního hráče, id termínu druhého hráče a duplicitu. Tabulky jsou plněny při zadávání termínu turnajů. Z tabulky dvojic si dokážu vytáhnout celkové pořadí podle výsledků (viz [#4]). Pro zjednodušení dotazu však při vyhodnocení potřebuji označit ty "neplatné" (duplicitní) výkony pro relevantní celkové pořadí. Jde mi o to, abych něco nedělal zbytečně složitě, když to jde inteligentněji - za současného stavu návrhu tabulek výsledků. Jedinou tabulku se kterou mohu ještě manipulovat je ona tabulka dvojic s popsanou strukturou. Řešením je např. načtení dotazu do pole, setřídit jej a v cyklu provést kontrolu dvojic, uložit neplatné id záznamu a následně nastavit hodnotu duplicity pro vybrané id. Pokud je potřeba nějaké konkrétní ukázky nebo podrobností, uvedu je. |
||
Časová prodleva: 9 let
|
0