Alternative für LIMIT in Subqueries

babo47

Neuer Benutzer
Beiträge
3
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
 
Werbung:
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=*#
 
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>
 
Werbung:
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
 
Zurück
Oben