Autor Zpráva
Kubista
Profil
Zdravím,

je možné nějakým elegantním způsobem, již na úrovni sql, získat maximální a minimální hodnotu ze sloupců (sloupec1, sloupec2, sloupec3, sloupec4) tak, aby to bylo pouze v rámci jednoho řádku?

Pro řádek s id=1 bych získal: max=9, min=2
Pro řádek s id=2 bych získal: max=10, min=1

Tabulka (sloupec1-4 je typu int)
id | jmeno   | sloupec1      | sloupec2      | sloupec3       | sloupec4
1  | Jan     |      5        |       2       |        3       |       9
2  | Eva     |      1        |       10      |        4       |       5

Předem díky za odpověď.
Kajman_
Profil *
greatest(), least()


S tím, že máte asi špatný návrh, když číslujete sloupečky.
Leo
Profil
Není spíš špatně navržená struktura tabulek? Pokud sloupec1, ..., 4 vyjadřuje to samé? Leo
Kubista
Profil
Kajman_: díky :-)

Tabulka ve skutečnosti vypadá trochu jinak, ale v podstatě tady sloupec1-4 představuje hodnocení od 4 rozhodčích. Výsledné hodnocení je pak dáno tak, že se vyruší nejvyšší a nejnižší známka a ze zbytku se udělá průměr.

Když nad tím tak přemýšlím, možná bude lepší zvolit jeden sloupec pro hodnocení a hodnocení od jednotlivých rozhodčích vkládat vždy jako nový záznam.
Kajman_
Profil *
možná bude lepší zvolit jeden sloupec pro hodnocení
Jistě. Pak půjdou funkce min a max a není problém, aby hodnotilo víc rozhodčích a nic se nemusí měnit.
Kubista
Profil
Ještě se chci zeptat, když počítám hodnocení (vyruší se nejvyšší a nejnižší známka a ze zbytku se udělá průměr), lze to napsat nějak lépe než takto?

SELECT s.jmeno, s.prijmeni, s.stat, (SUM(znamka) - MAX(znamka) - MIN(znamka)) / (COUNT(id_rozhodci)-2) AS prumer
FROM hodnoceni AS h
	JOIN soutezici AS s
	ON s.id = h.id_soutezici
WHERE h.id_kolo = 3
GROUP BY h.id_soutezici, h.id_kolo, h.typ


Tabulka hodnocení

(sloupec typ rozlišuje známky za provedení a umělecký dojem)
Kajman_
Profil *
Napsal bych to asi stejně. Snad bych jen udělal složený index (id_kolo,id_soutezici,typ) pokud ještě není.
Kubista
Profil
Složený index mám :-)

Teď už snad poslední věc. Předchozí dotaz mi vrátí vždy dva výsledky u každého soutěžícího (umělecký dojem a provedení). Když bych chtěl ještě udělat součet obou výsledků, je vhodné to řešit takto?

SELECT s.id, s.jmeno, s.prijmeni, s.stat, SUM(h.hodnoceni) AS hodnoceni
FROM soutezici AS s
	JOIN (
		SELECT id_soutezici, (SUM(znamka) - MAX(znamka) - MIN(znamka)) / (COUNT(id_rozhodci) - 2) AS hodnoceni
		FROM hodnoceni
		WHERE id_kolo = 3
		GROUP BY id_soutezici, id_kolo, typ
	) AS h
	ON h.id_soutezici = s.id
GROUP BY s.id
Kajman_
Profil *
Myslím, že je to optimální. Pokud se to nezdá pomalé, nebo se Vám nezdá explain, tak bych to použil.
Kubista
Profil
Ok, díky moc. :-)

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