Autor Zpráva
Sión
Profil *
Mám tabulku kde je:

id | id_uzivatele | datum_vlozeni | hodnota_s
---+----------------+-------------------+---------------


potřeboval bych nějakým způsobem vybrat hodnotu_s pro všechny id_uzivatele, kteri jsou v tabulce, ale vždy jen jednu nejnovější hodnotu, která je ulozena v datumu.
Vůbec se mi to nedaří a už tady nad tím začínám lámat hůl.
Prosím poraďtě.
pcmanik
Profil
SELECT MAX(datum) FROM tabulka
Sión
Profil *
to vrátí řádek s nejvyšším datem, ale já potřebuju několik řádků. Vždy pro každé id_uzivatele s nejvyšším datem
Sión
Profil *
např.

id | id_uzivatele | datum_vlozeni | hodnota_s
---+--------------+------------+-------------
1        12            10-06-11    a
2        12            09-06-11    cd  
3        3              10-06-11    abc


potřebuju, aby to vrátilo řádek s id = 1 a id = 3
ShiraNai7
Profil
SELECT `id`,`id_uzivatele`,`hodnota_s` FROM `tabulka` GROUP BY `id_uzivatele` ORDER BY `datum_vlozeni` DESC

edit: to není správné řešení.. na ukázková data sedí jen náhodou
Sión
Profil *
Děkuji mockrát! ! !
Zas tak strašně složitý to koukám neni, jen bych měl znát tu funkci group by. Děkuji
ShiraNai7
Profil
Když se na to teď dívám, tak si nejsem jistý zda to nefunguje jen náhodou. Asi to tak bude.
Sión
Profil *
Mno, ale funguje to dobře :>
ShiraNai7
Profil
Dejte tam více náhodných dat a více uživatelů. To order by řadí až výsledné řádky, nikoliv ty zahrnuté v GROUP BY. Tj tento dotaz prostě vypíše jeden řádek pro každé `id_uzivatele`. Neřadí se správně.
Sión
Profil *
Zkouším to doma a tady mám více hodnot a více uživatelů a stále to funguje.
ShiraNai7
Profil
Stále jen náhoda.
Ukázková data:

id	id_uzivatele	datum_vlozeni	hodnota_s
---------------------------------------------------
1	12	2010-06-11	a
2	12	2012-06-12	cd
3	3	2010-06-11	abc


Výsledek by tedy měl být - řádek 2 a 3, respektive hodnoty "cd" a "abc". Změnil jsem rok na 2012 úmyslně, abych demonstroval nefunkčnost původního dotazu.



Nesprávná možnost:
SELECT
  `id`,
  `id_uzivatele`,
  `hodnota_s`
FROM `tabulka`
GROUP BY `id_uzivatele`
ORDER BY `datum_vlozeni` DESC;


Vypíše toto:
id	id_uzivatele	hodnota_s
----------------------------
3	3	abc
1	12	a


A to je špatně.



Správná možnost
SELECT
  `id_uzivatele`,
  (SELECT
     `hodnota_s`
   FROM `tabulka` `_sub`
   WHERE `_sub`.`id_uzivatele` = `tabulka`.`id_uzivatele`
   ORDER BY `datum_vlozeni` DESC
   LIMIT 1) `hodnota_s`
FROM `tabulka`
GROUP BY `id_uzivatele`;


Vypíše:
id_uzivatele	hodnota_s
--------------------------
3	abc
12	cd


A to je správně.

Poznámka - do dotazu nepřidávej sloupec `id`, protože nebude souhlasit s `id` řádku, kde se nachází maximální hodnota. Aby tomu tak bylo, musel by se dotaz sestavit jinak.
Sión
Profil *
aha, pak to tak snadné opravdu nebylo. Dohromady bych to s mojí znalostí asi nedal. Děkuji tedy mnohokrát za čas.
ShiraNai7
Profil
Sión:
Taky neručím za rychlost takového dotazu. Každopádně mej indexy minimálně na těchto sloupcích: id_uzivatele a datum_vlozeni
TomášK
Profil
ShiraNai7:
Toto chování je popsáno i někde v dokumentaci. Ve sloupcích dotazu s group by se můžou vyskytnout buď záznamy, které jsou v klauzuli group by nebo záznamy, na které je aplikovaná nějaká agregační funkce. MySQL a některé další databáze umožňují dát tam i další sloupce z tabulky, hodnota toho sloupce bude náhodná hodnota některého záznamu z dané skupiny.

Následující varianta by měla být rychlejší, ale nezkoušel jsem.
SELECT 
  id_uzivatele, hodnota_s
FROM 
  tabulka
  JOIN (
    SELECT id_uzivatele, MAX(datum) FROM tabulka GROUP BY id_uzivatele
  ) posledni_clanky ON 
    posledni_clanky.id_uzivatele = tabulka.id_uzivatele AND
    posledni_clanky.datum = tabulka.datum
GROUP BY id_uzivatele
neználek
Profil *
Dobrý den,
mohl by mi někdo poradit jak postavit podmínku na výběr řádků z databáze podle jména dne v týdnu?

v tabulce je pouze (mimo jiné) standardní datum a potřebuji vybrat popř. vyloučit řádky určitého dne např. Neděle (Sun)...

zjistit z datumu odpovídající jméno dne umím, ale nedaří se mi to postavit jako podmínku pro výběr řádků z databáze...

Děkuji za radu
Tori
Profil
Tak když víte, že DAYNAME(sloupec_s_datem) vrátí "Monday", tak stačí dát do podmínky
WHERE DAYNAME(sloupec) != 'Monday'
anebo asi by šlo i
WHERE DAYNAME(sloupec) NOT IN ('Monday', 'Sunday')
neználek
Profil *
Tori:
... aha ... používal jsem asi zbytečně komplikovaně dvě funkce v sobě ... DATE, která to vyrábí z timestamp a co vracela 'Sun' apod.
a vevnitř STRTOTIME co dělala z YYYY-MM-DD timestamp ...

... date('D', strtotime(sloupec_s_datem)) != 'Sun' ... ale to nechodilo ...

(zkoušel jsem ještě nějaké podobné fce, ale taky nic) ....

... tuhle jednoduchou jsem neznal ... jdu to zkusit ... ucim se a hledam kde muzu, takze obcas to resim asi příliš komplikovaně ... :-)

Díky za radu
neználek
Profil *
Tori:
... ještě jednou díky ... vše již funguje jak má ...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0