Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Alternative für LIMIT in Subqueries

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von babo47, 10 Juni 2017.

  1. babo47

    babo47 Neuer Benutzer

    Hallo,

    folgendes SQL soll mir die 3 meistgekauften Produkte aus 3 verschiedenen Kategorien ausgeben.
    Eine Fehlermeldung sagt mir, dass ich kein LIMIT in Subqueries anwenden kann.

    *********************************************************************

    SELECT id
    FROM produkte
    WHERE id in
    (
    SELECT id
    FROM produkte
    WHERE
    kategorie = a
    ORDER BY gekauft DESC LIMIT 3
    )
    OR
    id in (
    SELECT id
    FROM produkte
    WHERE
    kategorie = b
    ORDER BY gekauft DESC LIMIT 3
    )
    OR
    id in (
    SELECT id
    FROM produkte
    WHERE
    kategorie = c
    ORDER BY gekauft DESC LIMIT 3
    );

    *********************************************************************

    Gibt es für diese Anforderung vielleicht eine Alternative?

    Jemand eine Idee?
    Gruß Bastian
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Ja, in SQL via Window-Funktionen. Kann MySQL aber nicht.
     
    BerndB gefällt das.
  3. akretschmer

    akretschmer Datenbank-Guru

    mal als Demo:

    Code:
    test=*# create table babo47 as select kat, produkt, sum(gekauft) as gekauft from (select (random()*20)::int as kat, (random() * 50)::int as produkt, (random()*100)::int as gekauft from generate_series(1, 100)  s) foo group by kat, produkt order by kat, produkt;
    
    test=*# select * from babo47 order by kat, produkt limit 40;
     kat | produkt | gekauft
    -----+---------+---------
      0 |  5 |  64
      0 |  19 |  31
      0 |  29 |  37
      0 |  36 |  71
      0 |  42 |  58
      0 |  46 |  38
      1 |  6 |  34
      1 |  9 |  26
      2 |  14 |  47
      2 |  25 |  19
      2 |  26 |  53
      2 |  29 |  66
      2 |  36 |  14
      2 |  42 |  13
      2 |  45 |  32
      2 |  47 |  87
      3 |  5 |  123
      3 |  20 |  4
      3 |  22 |  51
      3 |  25 |  24
      3 |  26 |  49
      3 |  30 |  40
      3 |  32 |  91
      4 |  27 |  7
      4 |  40 |  96
      4 |  41 |  7
      5 |  11 |  25
      5 |  19 |  40
      6 |  19 |  55
      6 |  22 |  89
      6 |  25 |  95
      6 |  29 |  84
      6 |  31 |  59
      7 |  32 |  96
      7 |  41 |  34
      7 |  42 |  28
      8 |  22 |  74
      8 |  29 |  96
      8 |  31 |  89
      9 |  6 |  71
    (40 Zeilen)
    
    test=*# select kat, produkt, gekauft from (select kat, produkt, gekauft, rank() over (partition by kat order by gekauft desc) from babo47) foo where rank <= 3 and kat in (0,3,6);
     kat | produkt | gekauft
    -----+---------+---------
      0 |  36 |  71
      0 |  5 |  64
      0 |  42 |  58
      3 |  5 |  123
      3 |  32 |  91
      3 |  22 |  51
      6 |  25 |  95
      6 |  22 |  89
      6 |  29 |  84
    (9 Zeilen)
    
    test=*#
    
     
  4. BerndB

    BerndB Datenbank-Guru

    Hast du schon mal MariaDB 10.2 angesehen. Da gibts natürlich Window Funktionen und vieles nettes mehr..
    Gruß
    Bernd
     
    akretschmer gefällt das.
  5. BerndB

    BerndB Datenbank-Guru

    Hi,

    probier das mal. Da hast du alles in einem SELECT:

    Code:
    SELECT *
    FROM
        produkte
    WHERE
        kategorie IN ('a','b','c')
    ORDER BY
        FIND_IN_SET(kategorie, 'a,b,c') ASC,
        gekauft DESC
    LIMIT 3;
    Mit FIND_IN_SET(kategorie, 'a,b,c') kannst du die Reihenfolge bestimmen welche Kategorie zuerst angezeigt werden soll.


    Beispiele:

    Code:
    mysql> select * from produkte;
    +----+-----------+---------+
    | id | kategorie | gekauft |
    +----+-----------+---------+
    |  1 | a         |       2 |
    |  2 | a         |      99 |
    |  3 | c         |       3 |
    |  4 | b         |       9 |
    +----+-----------+---------+
    4 rows in set (0,00 sec)
    
    mysql> SELECT *
        -> FROM
        ->     produkte
        -> WHERE
        ->     kategorie IN ('a','b','c')
        -> ORDER BY
        ->     FIND_IN_SET(kategorie, 'a,b,c') ASC,
        ->     gekauft DESC
        -> LIMIT 3;
    +----+-----------+---------+
    | id | kategorie | gekauft |
    +----+-----------+---------+
    |  2 | a         |      99 |
    |  1 | a         |       2 |
    |  4 | b         |       9 |
    +----+-----------+---------+
    3 rows in set (0,00 sec)
    
    mysql> SELECT *
        -> FROM
        ->     produkte
        -> WHERE
        ->     kategorie IN ('a','b','c')
        -> ORDER BY
        ->     FIND_IN_SET(kategorie, 'c,a,b') ASC,
        ->     gekauft DESC
        -> LIMIT 3;
    +----+-----------+---------+
    | id | kategorie | gekauft |
    +----+-----------+---------+
    |  3 | c         |       3 |
    |  2 | a         |      99 |
    |  1 | a         |       2 |
    +----+-----------+---------+
    3 rows in set (0,01 sec)
    
    mysql>
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Echt? Whow!
     
  7. ukulele

    ukulele Datenbank-Guru

    ginge auch so:
    Code:
    SELECT id
    FROM produkte
    WHERE
    kategorie = a
    ORDER BY gekauft DESC LIMIT 3
    UNION ALL
    SELECT id
    FROM produkte
    WHERE
    kategorie = b
    ORDER BY gekauft DESC LIMIT 3
    UNION ALL
    SELECT id
    FROM produkte
    WHERE
    kategorie = c
    ORDER BY gekauft DESC LIMIT 3
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden