Autor | Zpráva | ||
---|---|---|---|
capricorn Profil |
#1 · Zasláno: 9. 7. 2009, 17:23:41 · Upravil/a: capricorn
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 |
#2 · Zasláno: 9. 7. 2009, 17:44:52 · Upravil/a: TomášK
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 |
#3 · Zasláno: 9. 7. 2009, 18:18:44
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 |
#4 · Zasláno: 10. 7. 2009, 10:45:58
Nikdo nevi, jak ten dotaz sestavit, aby fungoval spravne?
|
||
Kajman_ Profil * |
#5 · Zasláno: 10. 7. 2009, 11:08:03
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 |
#6 · Zasláno: 10. 7. 2009, 12:36:56
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 |
#8 · Zasláno: 10. 7. 2009, 13:34:39 · Upravil/a: capricorn
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 * |
#9 · Zasláno: 10. 7. 2009, 17:10:55
id=2 nemá první ani třetí sloupec maximální. Maximem jsou čísla 2.000 a 5.000 viz. řádek id=3.
|
||
capricorn Profil |
#10 · Zasláno: 10. 7. 2009, 17:50:33
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 * |
#11 · Zasláno: 10. 7. 2009, 18:32:46
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 |
#12 · Zasláno: 10. 7. 2009, 19:18:32
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. |
||
Časová prodleva: 16 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0