MySQL - Vyber riadkov s MAX hodnotou v jednom stlpci – MySQL – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

MySQL - Vyber riadkov s MAX hodnotou v jednom stlpci – MySQL – Fórum – Programujte.comMySQL - Vyber riadkov s MAX hodnotou v jednom stlpci – MySQL – Fórum – Programujte.com

 

Prog.0
Věrný člen
29. 5. 2008   #1
-
0
-

| skupina | hodnota | data1 | data2 | data...

+---------+---------+-------+----------------
| 1 | 5 | A | ..... | .
| 1 | 10 | B | ....
| 2 | 7 | C | ...
| 2 | 12 | D | .

Z takejto tabuľky chcem vytiahnuť pre každú skupinu jeden (celý!) riadok, tak aby v tom riadku bola hodnota v druhom stĺpci maximálna v rámci všetkých riadkov danej skupiny.

Výsledkom má byť teda toto:

| skupina | hodnota | data1 | data2 | data...

+---------+---------+-------+----------------
| 1 | 10 | B | ....
| 2 | 12 | D | .


Podarilo sa mi dať dokopy tieto selecty, no dúfam, že bude existovať aj jednoduchší a rýchlejší spôsob. Ak ho niekto pozná, tak sem sním ;-) Ak nie, tak aspoň poraďte, ktorý použiť.

SELECT T1.* 

FROM tabulka AS T1
INNER JOIN (SELECT skupina,MAX(hodnota) AS max_hodnota
FROM tabulka GROUP BY skupina) AS T2
ON
T1.skupina = T2.skupina
AND
T1.hodnota=T2.max_hodnota


SELECT *

FROM (
SELECT *
FROM tabulka
ORDER BY skupina, hodnota DESC
) AS T1
GROUP BY skupina

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
JannyM0
Návštěvník
30. 5. 2008   #2
-
0
-

Neviem ci je to zlozitejsie alebo nie ale urcite to funguje

<?php
$result = mysql_query ("SELECT distinct(skupina) FROM test");
echo mysql_error();
$i=0;
while ($row = mysql_fetch_array ($result))
{
$array[$i] = $row["skupina"];
$i++;
}
$i = NULL;

foreach ($array as $value)
{
echo "Skupina: ".$value." ";
$result = mysql_query ("SELECT hodnota, data FROM test WHERE skupina = '$value' ORDER BY hodnota DESC limit 0,1");

while ($row = mysql_fetch_array ($result))
{
echo $row["hodnota"]." ".$row["data"]."";

}
}
mysql_close($link);
?>

Nahlásit jako SPAM
IP: 62.189.16.–
Prog.0
Věrný člen
30. 5. 2008   #3
-
0
-

To JannyM : Som rád že sa aspoň niekto ozval. No, chcem jedno rýchle a pamäťovo nenáročné query, lebo tvojim postupom zaťažím aj PHP a zároveň aj databázu množstvom požiadaviek...


Len som myslel, či na tento problém neexistuje nejaké primitívne, univerzálne riešenie...

ten INNER JOIN som prepísal na WHERE, DESCRIBE vypíše presne to isté, ale zápis query je kratší a vyzerá čitateľnejšie :-)

Ak sa k tomu niekto náhodou dostane, tak sa prosím pozrite na:

DESCRIBE spomínaných query, raz je tabuľka bez indexov, raz je primary index na (skupina, hodnota):

Nerozumiem prečo sa v tom subquery (query 2 s indexom) nepoužil index, aspoň v tom zoradení. (prečo je tam using filesort ???) Vyplýva z toho všetkého, že najrozumňejšie je použiť práve ten prvý query, ktorý ten index zoberie ?

Prípadne, fakt MySQL nemá triviálny spôsob na vykonanie takého selectu ???


Query 1 - [tabľka] join [SELECT skupina, max(hodnota)]

SELECT T1.* 

FROM tabulka AS T1,
(SELECT skupina, max(hodnota) as max_hodnota
FROM tabulka GROUP BY skupina) AS T2
WHERE
T1.skupina = T2.skupina
AND
T1.hodnota = T2.max_hodnota;

# pre tabuľku bez indexov:
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | |
| 1 | PRIMARY | T1 | ALL | NULL | NULL | NULL | NULL | 4 | Using where |
| 2 | DERIVED | tabulka | ALL | NULL | NULL | NULL | NULL | 4 | Using temporary; Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+

# s indexom:
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | |
| 1 | PRIMARY | T1 | eq_ref | PRIMARY | PRIMARY | 8 | T2.skupina,T2.max_hodnota | 1 | |
| 2 | DERIVED | tabulka | index | NULL | PRIMARY | 8 | NULL | 4 | Using index |
+----+-------------+------------+--------+---------------+---------+---------+---------------------------+------+-------------+


Query 2 - groupovanie usporiadaného subquery:
SELECT *

FROM (
SELECT *
FROM tabulka
ORDER BY skupina, hodnota DESC
) AS T1
GROUP BY skupina;

# pre tabuľku bez indexov:
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 4 | Using temporary; Using filesort |
| 2 | DERIVED | tabulka | ALL | NULL | NULL | NULL | NULL | 4 | Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+

# s indexom:
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+
| 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 4 | Using temporary; Using filesort |
| 2 | DERIVED | tabulka | ALL | NULL | NULL | NULL | NULL | 4 | Using filesort |
+----+-------------+------------+------+---------------+------+---------+------+------+---------------------------------+

Nahlásit jako SPAM
IP: 213.160.186.–
Prog.
JannyM0
Návštěvník
30. 5. 2008   #4
-
0
-

Hej viem len som chel skusit ci to dokazem urobit trochu inak a podarilo sa tak preco to nezverejnit :) ale efektivnost kodu e ZERO :)

Nahlásit jako SPAM
IP: 62.189.16.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 12 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý