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.

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
Maak gebruik van UNION.
Of gebruik ROW_NUMBER() als window-functie, bijvoorbeeld:
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:
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

Reageren