randomuser Posted January 11, 2009 Report Share Posted January 11, 2009 SELECT * FROM tabula GROUP BY x ORDER BY y DESC y ir skaitlis, x ir teksts. Tabulas piemērs: | id | x | y | -------------------------- | 1 | 'abc' | 150 | | 2 | 'def' | 160 | | 3 | 'aaa' | 130 | | 4 | 'abc' | 200 | Man vajag, lai atgrieztu unikālos x, sakārtots pēc y dilstoši. Atgriezt vajadzētu 200 'abc', 160 'def', 130 'aaa'... Bet tā nav, ir ap 700 ierakstu datubāzē, un netiek atgrieztas pašas lielākās y vērtības. Varbūt tagad vienkārši nedomājas kā vajadzētu, bet nu okei. Link to comment Share on other sites More sharing options...
marcis Posted January 12, 2009 Report Share Posted January 12, 2009 SELECT DISTINCT(x) FROM `tabula` ORDER BY y DESC Link to comment Share on other sites More sharing options...
randomuser Posted January 12, 2009 Author Report Share Posted January 12, 2009 Ok, šis variants derētu, bet ja ir vēlviena kolonna "z": | id | x | y | z | -------------------------- | 1 | 'abc' | 150 | 'jklasdjkls' | | 2 | 'def' | 160 | '12asdasda' | | 3 | 'aaa' | 130 | 'kqooqooq' | | 4 | 'abc' | 200 | 'msopqppq' | Tad DISTINCT(x) neder. Link to comment Share on other sites More sharing options...
Grey_Wolf Posted January 12, 2009 Report Share Posted January 12, 2009 (edited) Ok, šis variants derētu, bet ja ir vēlviena kolonna "z":Tad DISTINCT(x) neder. Kapeec needr ?? VAi tad SQL vaicajumaa preciza kolonu noradiisana ir atcelta ??? SELECT lauki kurus jaraada un nosacijumi kaa jaraada FROM tabula(as) kas jaizmanto WHERE atlasisanas filtri ORDER BY kartot pec kolonnas DESC (ASC) virziens un taatad tavaa gadijuma klat nak tikai , Z un ieteiktu lietot Alias ( AS ) lai butu parskatamaks kods PHP galaa taatad SELECT DISTINCT(x) AS x_lauks , z FROM `tabula` ORDER BY y DESC Edited January 12, 2009 by Grey_Wolf Link to comment Share on other sites More sharing options...
randomuser Posted January 12, 2009 Author Report Share Posted January 12, 2009 Vai nu es kaut kur galīgi esmu nošāvis greizi vai kā, bet SELECT DISTINCT(x) AS x_lauks , z FROM `tabula` ORDER BY y DESC neatgriež unikālos x, bet gan visus z un visus x. Kad ir tikai DISTINCT(x) tiek atgriezti tikai unikālie x, bet tiklīdz pieliek klāt arī z kolonnu, tā tiek parādītas visas arī ne unikālās x vērtības. Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 12, 2009 Report Share Posted January 12, 2009 SELECT DISTINCT(x) AS x_lauks , z FROM `tabula` ORDER BY y DESC Kad ir tikai DISTINCT(x) tiek atgriezti tikai unikālie x, bet tiklīdz pieliek klāt arī z kolonnu, tā tiek parādītas visas arī ne unikālās x vērtības. Hmmm a kā tad Tu vēlies? Ja tev ir šādi dati: x z 1 1 1 2 tad ko serverim atgriezt z kolonā, ja rezultātā būs tikai 1 ieraksts??? Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
randomuser Posted January 12, 2009 Author Report Share Posted January 12, 2009 (edited) Bet rezultātā jau tieši neatgriež vienu rezultātu, bet (ņemot datus no tava piemēra) tiek atgriezti abi divi: x z 1 1 1 2 Edited January 12, 2009 by randomuser Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 12, 2009 Report Share Posted January 12, 2009 Visa sāls bija šajā jautājumā: a kā tad Tu vēlies???? Serveris atgriež to ko viņš atgriež tb pareizi un korekti. Definē savas prasības un tad skatīsiemies kāds SQL teikums būs tām atbilstošs :) Gints Plivna http://datubazes.wordpress.com/ Link to comment Share on other sites More sharing options...
randomuser Posted January 12, 2009 Author Report Share Posted January 12, 2009 (edited) Es vēlos, lai atgrieztu katru unikālo x, kuram būtu vislielākais y salīdzinot ar citiem vienādajiem x. Tikai vēl nāk neatkarīga z kolonna, kurā, piemēram, ir kaut kāds teksts (katram ierakstam savādāks). x | y | z 1 | 2 | asdaskdljkjajsldjakl 1 | 3 | asdaskdljkjajsldjakl 1 | 5 | asdaskdljkjajsldjakl 2 | 3 | asdaskdljkjajsldjakl 2 | 55 | asdaskdljkjajsldjakl 2 | 1 | asdaskdljkjajsldjakl 3 | 15 | asdaskdljkjajsldjakl 3 | 3 | asdaskdljkjajsldjakl no šī te būtu jātgriež 1 | 5 | asdaskdljkjajsldjakl 2 | 55 | asdaskdljkjajsldjakl 3 | 15 | asdaskdljkjajsldjakl Edited January 12, 2009 by randomuser Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 12, 2009 Report Share Posted January 12, 2009 Diemžēl Tevis dotie dati neatbilst izteikumiem citēju: "Tikai vēl nāk neatkarīga z kolonna, kurā, piemēram, ir kaut kāds teksts (katram ierakstam savādāks)." Z kolona visur satur vienu un to pašu vērtību. Esi precīzs, jo SQLs arī ir precīzs. Gints Plivna http://datubazes.wordpress.com/ Link to comment Share on other sites More sharing options...
randomuser Posted January 12, 2009 Author Report Share Posted January 12, 2009 (edited) Jā, manā piemērā diemžēl ierakstīju z kolonnām visas vērtības vienādas :) Lūk, šadi vajadzēja būt: x | y | z 1 | 2 | foo bar 1 | 3 | otrais 1 | 5 | piektais 2 | 3 | simtais 2 | 55 | četri 2 | 1 | banāns 3 | 15 | trešais 3 | 3 | devītais būtu jāatgriež x | y | z 1 | 5 | piektais 2 | 55 | četri 3 | 15 | trešais un ja ņem vērā ORDER BY, tad x | y | z 2 | 55 | četri 3 | 15 | trešais 1 | 5 | piektais Edited January 12, 2009 by randomuser Link to comment Share on other sites More sharing options...
Gints Plivna Posted January 12, 2009 Report Share Posted January 12, 2009 Citreiz lūgtum iedot create un insert skriptiņus, lai pašam nav jāmokās. Tātad ja z vērtība nav svarīga tad, tas ir pavisam vienkārši: mysql> create table tb (x integer, y integer, z varchar(10)); Query OK, 0 rows affected (0.16 sec) mysql> insert into tb values (1, 2, 'foo bar'), (1, 3, 'otrais'), -> (1, 5, 'piektais'), (2, 3, 'simtais'), (2, 55, 'cetri'), -> (2, 1, 'banans'), (3, 15, 'tresais'), (3, 3, 'devitais'); Query OK, 8 rows affected (0.03 sec) Records: 8 Duplicates: 0 Warnings: 0 mysql> select x, max(y), z -> from tb -> group by x -> order by 2 desc; +------+--------+---------+ | x | max(y) | z | +------+--------+---------+ | 2 | 55 | simtais | | 3 | 15 | tresais | | 1 | 5 | foo bar | +------+--------+---------+ 3 rows in set (0.00 sec) MySQLs gan atļauj lopiski grābt z kolonu kaut gan pēc tās nenotiek grupēšana, taču tomēr tam vērtība tiek paņemta izskatās, ka pirmā kura pagadās, bet katrā ziņā tā nav tā pati, kur atradām max (y). Tā kā ja tas neder, tad nākas veidot grupēšanu un tad savienojumu tabulai pašai uz sevi, lai atlasītu pareizu z kolonas vērtību: mysql> select t1.x, t1.max_y, t2.z -> from ( -> select x, max(y) max_y, z -> from tb -> group by x) t1 -> inner join tb t2 -> on (t1.x = t2.x and t1.max_y = t2.y) -> order by t1.max_y desc; +------+-------+----------+ | x | max_y | z | +------+-------+----------+ | 2 | 55 | cetri | | 3 | 15 | tresais | | 1 | 5 | piektais | +------+-------+----------+ 3 rows in set (0.00 sec) DBVS, kur ir pieejamas analītiskās f-jas šis būtu kā reiz tas gadījums, kur tās izmantot. Iespējams nekorekts rezultāts būs tad, ja būs 2 ieraksti ar maksimālajām y vērtībām, un dažādām z vērtībām (kaut gan datu specifikācijā tāda situācija nav paredzēta :) : mysql> insert into tb values (1, 5, 'piektais 2'); Query OK, 1 row affected (0.03 sec) mysql> select t1.x, t1.max_y, t2.z -> from ( -> select x, max(y) max_y, z -> from tb -> group by x) t1 -> inner join tb t2 -> on (t1.x = t2.x and t1.max_y = t2.y) -> order by t1.max_y desc; +------+-------+------------+ | x | max_y | z | +------+-------+------------+ | 2 | 55 | cetri | | 3 | 15 | tresais | | 1 | 5 | piektais | | 1 | 5 | piektais 2 | +------+-------+------------+ 4 rows in set (0.00 sec) tad nu nāksies, piemēram, grupēt vēlreiz: mysql> select x, max_y, min(z)z from ( -> select t1.x, t1.max_y, t2.z -> from ( -> select x, max(y) max_y, z -> from tb -> group by x) t1 -> inner join tb t2 -> on (t1.x = t2.x and t1.max_y = t2.y) -> ) t3 -> group by x, max_y -> order by max_y desc; +------+-------+----------+ | x | max_y | z | +------+-------+----------+ | 2 | 55 | cetri | | 3 | 15 | tresais | | 1 | 5 | piektais | +------+-------+----------+ 3 rows in set (0.00 sec) Ātrdarbība visam šim brīnumam diez vai būs tā labākā, bet uz 700 ierakstiem tā kā nevajadzētu to manīt :) un gan jau ka to var uzrakstīt vēl n dažādos veidos :) Gints Plivna http://datubazes.wordpress.com Link to comment Share on other sites More sharing options...
Recommended Posts