Jump to content
php.lv forumi

Recommended Posts

Posted

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.

Posted

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.

Posted (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 by Grey_Wolf
Posted

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.

Posted
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

Posted (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 by randomuser
Posted (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 by randomuser
Posted (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 by randomuser
Posted

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

×
×
  • Create New...