Eredmény: 1 - 10 (10) összesen

Téma: group by es order by egyutt

  1. #1
    Bölcs
    Csatlakozott
    11-03-05
    Hely
    UK
    Hozzászólás
    501
    Begyűjtött 66 köszönetet
    52 hozzászólásával

    Alapbeállítás group by es order by egyutt

    Hali, segitsegre lenne szuksegem. Van egy tablam amit szurnom kellene tipus szerint, azutan sorba kellene rendeznem pontszamok szerint, de fontos, hogy minden nev csak egyszer szerepeljen. Ertelemszeruen a tablaban kulonbozo pontszamokkal tobbszor is szerepelhet ugyanaz a nev es nekem a legmagasabb pontszamu kell.
    A tabla recordjai :

    id | nev | tipus | pontszam

    Amit probaltam : SELECT * FROM tabla WHERE tipus = 1 GROUP BY nev ORDER BY pontszam

    A gond, hogy a GROUP BY a csoportositott sorokbol kivalaszt egyet (vsz random) es azt adja vissza, nem a legmagasabb pontszamut.
    Van erre valami megoldas?


    Notex az online notesz, linkkatalógus, tartalommegosztó és még sok más...

  2. #2
    Tag
    Csatlakozott
    15-02-03
    Hozzászólás
    72
    Begyűjtött 24 köszönetet
    23 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Szerintem használd a max-ot kiválasztásnál.

    Kód:
    SELECT id, nev,tipus,max(pontszam) FROM tabla WHERE tipus = 1 GROUP BY nev ORDER BY pontszam




  3. Az alábbi felhasználók hálásak a válaszért:

    frankcrk (2015-06-14)

  4. #3
    Törzsvendég
    Csatlakozott
    14-08-26
    Hozzászólás
    167
    Begyűjtött 97 köszönetet
    66 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Ez esetben az "id", "tipus" nem szerepelhet a SELECT részben, mert nem csoportfüggvény/nincs a group by -ban. Ha ezekre nincs szükség a lekérdezés ereményében, úgy ezeket csak ki kell hagyni a SELECT részből.

    Idézet mfkzt eredeti hozzászólása Hozzászólás megtekintése
    Szerintem használd a max-ot kiválasztásnál.

    Kód:
    SELECT id, nev,tipus,max(pontszam) FROM tabla WHERE tipus = 1 GROUP BY nev ORDER BY pontszam




  5. Az alábbi felhasználók hálásak a válaszért:

    frankcrk (2015-06-14)

  6. #4
    Törzsvendég
    Csatlakozott
    14-08-26
    Hozzászólás
    167
    Begyűjtött 97 köszönetet
    66 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Ha kell az "id" -is, akkor azt is csoportfüggvénybe kell tenni. Feltételezve, hogy :
    - egy név ugyanazzal a pontszámmal csak egyszer szerepel
    vagy
    - többször szerepel, de más tipussal
    vagy
    - többször szerepel, de ez esetben mindegy, hogy melyik "id" -val legyen kiválasztva

    akkor a így módosítanám:

    SELECT max(id), nev, 1 "TIPUS", max(pontszam)
    FROM tabla
    WHERE tipus = 1
    GROUP BY nev
    ORDER BY max(pontszam) desc

    A max függvény miatt az "id" -ból a nagyobbat adja majd vissza, de ha a felül említett feltételezések teljesülnek, úgy ez a megoldás megfelelő. A TIPUS mezőbe konstans 1 kerül, mert erre szűrjük a lekérdezést egyébként is.



  7. Az alábbi felhasználók hálásak a válaszért:

    frankcrk (2015-06-14)

  8. #5
    Bölcs
    Csatlakozott
    11-03-05
    Hely
    UK
    Hozzászólás
    501
    Begyűjtött 66 köszönetet
    52 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    na most teljesen osszekavartam mkit A lenyeg, hogy van egy images tabla amibol nekem szinte minden mezot ki kell listazni. Minden a tablaban szereplo kepnek van egyedi id-je, adott szavazata (pontszam), tipusa, es a feltolto user neve/id-je. Egy toplista-ba akarom kirakni, melyik kep kapta a legtobb pontszamot TIPUSONKENT , de azt akarom, hogy minden user csak egyszer szerepelhessen a toplistaban. Mivel egy user-nek tobb kulonbozo kepe is lehet, kulonbozo pontszammal igy a tablaban ugyanazzal a user nevvel es id-vel tobb bejegyzes is van kulonbozo pontszamokkal es tipusokkal. Ezert szeretnem ha eloszor lenne egy listam a pontszamok szerint sorba rakva es tipus szerint szurve, majd abbol a listabol kell a 15 legmagasabb pontszammal rendelkezo kep, viszon egy user csak egyszer szerepelhet.
    Remelem igy erthetobb mit is szeretnek.



  9. #6
    Bölcs
    Csatlakozott
    11-03-05
    Hely
    UK
    Hozzászólás
    501
    Begyűjtött 66 köszönetet
    52 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    oke, koszi mkinek! MUKODIK!!! :P

    A vegleges mukodo SQL :
    Kód:
     
    SELECT id, nev,tipus,max(pontszam) as P 
    FROM tabla 
    WHERE tipus = 1 
    GROUP BY nev 
    ORDER BY P DESC




  10. #7
    Törzsvendég
    Csatlakozott
    14-08-26
    Hozzászólás
    167
    Begyűjtött 97 köszönetet
    66 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    select max(id) "ID", nev, max(p) "PONTSZAM"
    from (select id, max(nev) "NEV", max(pontszam) "P"
    from tabla
    where tipus = 1
    group by id)
    group by nev
    order by max(p) desc

    Idézet frankcrk eredeti hozzászólása Hozzászólás megtekintése
    na most teljesen osszekavartam mkit A lenyeg, hogy van egy images tabla amibol nekem szinte minden mezot ki kell listazni. Minden a tablaban szereplo kepnek van egyedi id-je, adott szavazata (pontszam), tipusa, es a feltolto user neve/id-je. Egy toplista-ba akarom kirakni, melyik kep kapta a legtobb pontszamot TIPUSONKENT , de azt akarom, hogy minden user csak egyszer szerepelhessen a toplistaban. Mivel egy user-nek tobb kulonbozo kepe is lehet, kulonbozo pontszammal igy a tablaban ugyanazzal a user nevvel es id-vel tobb bejegyzes is van kulonbozo pontszamokkal es tipusokkal. Ezert szeretnem ha eloszor lenne egy listam a pontszamok szerint sorba rakva es tipus szerint szurve, majd abbol a listabol kell a 15 legmagasabb pontszammal rendelkezo kep, viszon egy user csak egyszer szerepelhet.
    Remelem igy erthetobb mit is szeretnek.




  11. Az alábbi felhasználók hálásak a válaszért:

    frankcrk (2015-06-14)

  12. #8
    Bölcs
    Csatlakozott
    11-03-05
    Hely
    UK
    Hozzászólás
    501
    Begyűjtött 66 köszönetet
    52 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Idézet MrWolf eredeti hozzászólása Hozzászólás megtekintése
    select max(id) "ID", nev, max(p) "PONTSZAM"
    from (select id, max(nev) "NEV", max(pontszam) "P"
    from tabla
    where tipus = 1
    group by id)
    group by nev
    order by max(p) desc
    Ez meg jobb! koszi szepen



  13. #9
    Törzsvendég
    Csatlakozott
    14-08-26
    Hozzászólás
    167
    Begyűjtött 97 köszönetet
    66 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Itt arra azért érdemes figyelni, hogy mint ahogyan azt már írtam, a SELECT után NEM szerepelhet olyan mező, ami nincs benne a GROUP BY -ban vagy nem csoportfüggvény. Ennek oka a következő:

    Tételezzük fel, hogy ezek a soraid vannak:

    id | nev | tipus | pontszam

    1, akarmi, 1, 10
    2, akarmi, 1, 10

    Ebben az esetben, az adatbázisnak nem egyértelnű, hogy a max(pontszam) -hoz melyik "id" -t adja vissza, hiszen több megoldás is lehetséges. A komolyabb adatbáziskezelők emiatt ezt az SQL-t el sem fogadják. A MySQL viszont ilyenkor a háttérben egyszerűsít, és valójában MIN(id) fog lefutni, tehát ő neked eldönti, hogy a legkisebb id-val rendelkezőt adja vissza. Ez zavaró lehet, hogyha épp nem ez volt a szándék és mivel nem dob hibát (ami szerintem rossz hozzáállás) erre sok esetben fény se derül. Ezért szerintem ajánlott helyesen leírni az SQL-t, hogy biztosan az történjen, amit szeretnél.

    Idézet frankcrk eredeti hozzászólása Hozzászólás megtekintése
    oke, koszi mkinek! MUKODIK!!! :P

    A vegleges mukodo SQL :
    Kód:
     
    SELECT id, nev,tipus,max(pontszam) as P 
    FROM tabla 
    WHERE tipus = 1 
    GROUP BY nev 
    ORDER BY P DESC




  14. Az alábbi felhasználók hálásak a válaszért:

    frankcrk (2015-06-25)

  15. #10
    Bölcs
    Csatlakozott
    11-03-05
    Hely
    UK
    Hozzászólás
    501
    Begyűjtött 66 köszönetet
    52 hozzászólásával

    Alapbeállítás re: group by es order by egyutt

    Ebbe ugyesen bele is futottam es csak nehany nap mulva vettem eszre...atirtam ahogy te ajanlottad igy most tuti jo!

    Koszi!

    Idézet MrWolf eredeti hozzászólása Hozzászólás megtekintése
    Itt arra azért érdemes figyelni, hogy mint ahogyan azt már írtam, a SELECT után NEM szerepelhet olyan mező, ami nincs benne a GROUP BY -ban vagy nem csoportfüggvény. Ennek oka a következő:

    Tételezzük fel, hogy ezek a soraid vannak:

    id | nev | tipus | pontszam

    1, akarmi, 1, 10
    2, akarmi, 1, 10

    Ebben az esetben, az adatbázisnak nem egyértelnű, hogy a max(pontszam) -hoz melyik "id" -t adja vissza, hiszen több megoldás is lehetséges. A komolyabb adatbáziskezelők emiatt ezt az SQL-t el sem fogadják. A MySQL viszont ilyenkor a háttérben egyszerűsít, és valójában MIN(id) fog lefutni, tehát ő neked eldönti, hogy a legkisebb id-val rendelkezőt adja vissza. Ez zavaró lehet, hogyha épp nem ez volt a szándék és mivel nem dob hibát (ami szerintem rossz hozzáállás) erre sok esetben fény se derül. Ezért szerintem ajánlott helyesen leírni az SQL-t, hogy biztosan az történjen, amit szeretnél.




Könyvjelzők

Hozzászólás szabályai

  • Új témákat nem hozhatsz létre
  • Válaszokat nem küldhetsz
  • Fájlokat nem csatolhatsz
  • A hozzászólásaidat nem módosíthatod
  •