Вам нужен GROUP BY
.MySQL допускает предложение HAVING
без GROUP BY
.Весь запрос считается запросом агрегации и возвращает ровно одну строку.
Если вам нужны только повторяющиеся части:
SELECT jmeno, prijmeni, adresa, v.spz
FROM majitel m INNER JOIN
vozidlo v
ON m.id_majitel = v.id_majitel INNER JOIN
kat_kamera kk
ON kk.id_kategorie = v.id_kategorie INNER JOIN
snimek s
ON kk.id_kamera = s.id_kamera
WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
GROUP BY jmeno, prijmeni, adresa, v.spz
HAVING COUNT(*) >= 3;
(я рекомендую вам указать все имена столбцов, так что понятно, из каких таблиц они происходят.)
* timestamp
сложнее включить.Возможно, будет достаточно объединить их в одну строку:
SELECT jmeno, prijmeni, adresa, v.spz,
GROUP_CONCAT(timestamp) as timestamps
FROM majitel m INNER JOIN
vozidlo v
ON m.id_majitel = v.id_majitel INNER JOIN
kat_kamera kk
ON kk.id_kategorie = v.id_kategorie INNER JOIN
snimek s
ON kk.id_kamera = s.id_kamera
WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
GROUP BY jmeno, prijmeni, adresa, v.spz
HAVING COUNT(*) >= 3;
Если вы хотите отдельные строки, то в MySQL 8+ вы можете использовать оконные функции:
SELECT x.*
FROM (SELECT jmeno, prijmeni, adresa, v.spz, timestamp,
COUNT(*) OVER (jmeno, prijmeni, adresa, v.spz) as cnt
FROM majitel m INNER JOIN
vozidlo v
ON m.id_majitel = v.id_majitel INNER JOIN
kat_kamera kk
ON kk.id_kategorie = v.id_kategorie INNER JOIN
snimek s
ON kk.id_kamera = s.id_kamera
WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
GROUP BY jmeno, prijmeni, adresa, v.spz
) x
WHERE cnt >= 3;