Jump to content
php.lv forumi

GROUP BY, ORDER BY nekārtojas kā vajadzētu


randomuser

Recommended Posts

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

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

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 by Grey_Wolf
Link to comment
Share on other sites

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

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

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 by randomuser
Link to comment
Share on other sites

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 by randomuser
Link to comment
Share on other sites

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

×
×
  • Create New...