Autor Zpráva
capricorn
Profil
Zdravim,

dejme tomu, ze mam tabulku a ted potrebuji z ni vybrat vsechny jednickove, dvojkove a trojkove radky a ziskat z nich maximalni a minimalni hodnoty jednotlivych sloupcu za podminky, ze kazdy radek vysledku bude mit:

- max hodnotu sloupce1 a do dalsich sloupcu se dosadi hodnoty pro to dane id
- min hodnotu sloupce2 a do dalsich sloupcu se dosadi hodnoty pro to dane id
- max hodnotu sloupce3 a do dalsich sloupcu se dosadi hodnoty pro to dane id
- min hodnotu sloupce4 a do dalsich sloupcu se dosadi hodnoty pro to dane id
- pokud bude duplicitni hodnota min nebo max jednotlivych sloupcu, tak take vypsat tento radek

Nize uvedeny dotaz prepisuje id a ja momentalne nevim, jak to resit.

SELECT id, MAX(sloupec1), MIN(sloupec2), MAX(sloupec3), MIN(sloupec4)
FROM tabulka WHERE cisla IN(1,2,3) AND sloupec2 != 0.000 AND sloupec4 != 0.000
TomášK
Profil
Zkus tohle, zda funguje:
SELECT
    id, ...
FROM 
    tabulka 
    JOIN (
        SELECT 
            MAX(sloupec1) AS extrem1,
            MIN(sloupec2) AS extrem2,
            MAX(sloupec3) AS extrem3,
            MIN(sloupec4) AS extrem4,
        FROM 
            tabulka
        WHERE
            cisla IN (1,2,3)
    ) AS max
WHERE 
    cisla IN (1,2,3) AND (
        sloupec1 = extrem1 OR
        sloupec2 = extrem2 OR
        sloupec3 = extrem3 OR
        sloupec4 = extrem4 
    )


Pozn.: Porovnávání FLOATu pomocí rovná se je dost nevyzpytatelné
capricorn
Profil
TomášK

Nefunguje, db vraci nesmyslne vysledky. Napr. nejvyssi hodnota sloupce1 ma treba radek 20, ale ten dotaz vypise nesmyslne radky a k tomu da tu nejvyssi hodnotu. Funkce MIN() bere i 0.000 proto jsem tam mel tu podminky.
capricorn
Profil
Nikdo nevi, jak ten dotaz sestavit, aby fungoval spravne?
Kajman_
Profil *
Pokud má být splněna alespoň jedna z těch podmínek, tak by to mělo fungovat. Pokud všechny naráz, tak si změňte or na and.

Největší problém je s pochopením toho, co chcete, co takhle příklad dat (create, insert) a chtěný výsledek?
capricorn
Profil
Kajman_

CREATE TABLE `tabulka` (
`id` int(11) NOT NULL auto_increment,
`sloupec1` decimal(8,3) default NULL,
`sloupec2` decimal(8,3) default NULL,
`sloupec3` decimal(8,3) default NULL,
`sloupec4` decimal(8,3) default NULL,
`cisla` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `cisla` (`cisla`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=6;

INSERT INTO `tabulka` (`id`, `sloupec1`, `sloupec2`, `sloupec3`, `sloupec4`, `cisla`) VALUES
(1, '1.000', '1.000', '1.000', '1.000', 1),
(2, '1.000', '3.000', '3.000', '3.000', 1),
(3, '2.000', '1.000', '5.000', '5.000', 2),
(4, '2.000', '0.000', '6.000', '7.000', 3),
(5, '1.000', '1.000', '1.000', '0.000', 3);

Pro lepsi pochopeni jsem vytvoril zkusebni tabulku.

A ted potrebuji nasledujici za podminky IN(1,2):

id | MAX(sloupec1) | MIN(sloupec2) | MAX(sloupec3) | MIN(sloupec4)
1 | <span class="max">1.000</span> | <span class="min">1.000</span> | 1.000 | <span class="min">1.000</span>
2 | <span class="max">1.000</span> | 3.000 | <span class="max">3.000</span> | 3.000
3 | <span class="max">2.000</span> | <span class="min">1.000</span> | <span class="max">5.000</span> | <span class="min">5.000</span>

Pokud id splnuje podminku max, min, max, min, tak hodnotu sloupce obalit elementem v opacnem pripade vypsat hodnotu toho id v danem sloupecku bez elementu. Lepe to uz nedokazu vysvetlit. Span jsem tam dal pro lepsi pochopeni a pokud by to slo, tak tam muze i zustat, abych nemusel maximalni a minimalni hodnoty oznacovat na urovni php.
Kajman_
Profil *
A to dává nějaký smysl? V prvním sloupci máte max i při hodnotě 1, ale max toho sloupečku je 2. Obdobné anomálie jsou i v dalších sloupcích. A má tam být řádek s id=2, když nemá žádný limitní údaj?
capricorn
Profil
Kajman_

Asi myslite id(1,2), ale ja myslim cisla(1,2), takze id 1 a id 2 maji stejnou maximalni hodnotu t.j. 1.000. Id 4 a id 5 neni ve vypise z toho duvodu, ze jsem bral jen cisla IN(1,2) a ne cisla IN(1,2,3), aby se v tom dalo vyznam, coz se mne nepovedlo, protoze to nechapete.

A kdyz jsou to anomalie, tak jak Vy by jste to udelal?

id=2 podle meho nazoru by tam melo byt, protoze ma stejnou max hodnotu

EDIT: a jeste id=2 ma max hodnotu sloupec3
Kajman_
Profil *
id=2 nemá první ani třetí sloupec maximální. Maximem jsou čísla 2.000 a 5.000 viz. řádek id=3.
capricorn
Profil
Kajman_

Ale ano ma, protoze vyberu vsechny radky napr. s cislem 1 a potom hledam max a min hodnoty jednotlivych sloupcu, takze max hodnota u prvniho sloupce je pro id1 a pro id2, protoze maji stejnou hodnotu t.j. 1.000,
min hodnotu sloupce2 ma id1 t.j. 1.000, max hodnotu sloupce3 ma id2 t.j. 3.000, min hodnotu sloupce4 ma id1 t.j. 1.000.

1, '1.000', '1.000', '1.000', '1.000', 1,
2, '1.000', '3.000', '3.000', '3.000', 1

Vy to asi chapete tak, ze chci ziskat max, min hodnoty z celeho celku, ale ja chci jen ziskat max a min hodnoty z jednotlivych skupinek, proto mam nastaven index i na sloupec 'cisla'. Proste na id zapomente a ja uz nevim, jak to lepe vysvetlit.
Kajman_
Profil *
ale ja chci jen ziskat max a min hodnoty z jednotlivych skupinek
Tohle je docela důležitá informace. Tomáš to bral také ze všech vybraných. Zkuste
select t.*,
       if(sloupec1 = limity.extrem1, 'max', null) class1,
       if(sloupec2 = limity.extrem2, 'min', null) class2,
       if(sloupec3 = limity.extrem3, 'max', null) class3,
       if(sloupec4 = limity.extrem4, 'min', null) class4
from   tabulka t
join   (select cisla,
               max(nullif(sloupec1, 0)) as extrem1,
               min(nullif(sloupec2, 0)) as extrem2,
               max(nullif(sloupec3, 0)) as extrem3,
               min(nullif(sloupec4, 0)) as extrem4
        from   tabulka
        where  cisla in (1, 2)
        group  by cisla) as limity
				on t.cisla = limity.cisla and (sloupec1 = limity.extrem1 or
                                       sloupec2 = limity.extrem2 or
                                       sloupec3 = limity.extrem3 or
                                       sloupec4 = limity.extrem4)
capricorn
Profil
Kajman_

Smekam a zaroven dekuji. Tak za to se omlouvam, ale myslel jsem si, ze to bude spravne pochopeno. Kdyz jste porad psal o id, tak jsem si rekl, ze to asi spatne chapete a radeji jsem napsal o tech skupinkach. Kazdopadne vazne smekam a jeste jednou dekuji.
Toto téma je uzamčeno. Odpověď nelze zaslat.