Selecteer X aantal rijen in Y aantal groepen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Elise S

Elise S

17/04/2021 16:16:44
Quote Anchor link
Onderstaande code voer ik nu 8x uit op 1 pagina omdat ik max 5 rijen gegevens uit meerdere categorieën (8) nodig heb. Categorieën bestaan uit getallen in stappen van 100. Ik weet dat er een slimmere manier is om dit in 1 query te doen maar mijn kennis van MySQL is beperkt. Ik kan een SELECT-query doen maar dan heb je het ook gehad. Weet iemand een oplossing? Thx.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
SELECT *
FROM gegevens
WHERE categorie='500'
AND gesloten IS NULL
AND DATE_SUB(NOW(), INTERVAL 24 HOUR)<datum
AND id!='18' AND id!='46' AND id!='109' AND id!='227'
AND id_gebruiker!='197'
ORDER BY vertoningen DESC
LIMIT 5
Gewijzigd op 17/04/2021 19:02:57 door Elise S
 
PHP hulp

PHP hulp

18/09/2021 13:37:13
 
Ad Fundum

Ad Fundum

18/04/2021 11:23:49
Quote Anchor link
Maak gebruik van UNION.
Of gebruik ROW_NUMBER() als window-functie, bijvoorbeeld:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
  `gegevens`.*,
  ROW_NUMBER() OVER (
    PARTITION BY `gegevens`.`categorie`
    ORDER BY `gegevens`.`vertoningen` DESC
  ) AS `rn`
FROM `gegevens`
WHERE `gegevens`.`categorie` IN (100, 200, 300, 400, 500, 600, 700, 800)
  AND `gegevens`.`gesloten` IS NULL
  AND DATE_SUB(NOW(), INTERVAL 24 HOUR) < `gegevens`.`datum`
  AND `gegevens`.`id` NOT IN (18, 46, 109, 227)
  AND `gegevens`.`id_gebruiker` != 197
ORDER BY
  `gegevens`.`categorie`,
  `gegevens`.`vertoningen` DESC
HAVING `rn` < 6

Ik heb deze query niet uitgeprobeerd, maar als het goed is vreet MySQL het HAVING statement. Zo niet kan je een truukje uithalen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
WITH `t` AS (
  SELECT
    `gegevens`.*,
    ROW_NUMBER() OVER (
      PARTITION BY `gegevens`.`categorie`
      ORDER BY `gegevens`.`vertoningen` DESC
    ) AS `rn`
  FROM `gegevens`
  WHERE `gegevens`.`categorie` IN (100, 200, 300, 400, 500, 600, 700, 800)
    AND `gegevens`.`gesloten` IS NULL
    AND DATE_SUB(NOW(), INTERVAL 24 HOUR) < `gegevens`.`datum`
    AND `gegevens`.`id` NOT IN (18, 46, 109, 227)
    AND `gegevens`.`id_gebruiker` != 197
)
SELECT `t`.*
FROM `t`
WHERE `t`.`rn` < 6
ORDER BY
  `gegevens`.`categorie`,
  `gegevens`.`vertoningen` DESC
Gewijzigd op 18/04/2021 11:45:24 door Ad Fundum
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.