Autor Zpráva
Lonanek
Profil
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
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
a podle výkonu potřebuji určit duplicitu položek hrac1 a hrac2, respektive její nastavení.

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
Lonanek:
A co takhle do databáze duplicity vůbec nevkládat? Není to lepší řešení?
Lonanek
Profil
Domnívám se, že programově by to bylo složitější na kontroly existujících dvojic.
Keeehi
Profil
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
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
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.

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: