Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL-拥有COUNT()不会';I don’我没有按预期工作_Mysql_Sql - Fatal编程技术网

Mysql SQL-拥有COUNT()不会';I don’我没有按预期工作

Mysql SQL-拥有COUNT()不会';I don’我没有按预期工作,mysql,sql,Mysql,Sql,我加入了几个表,并使用以下代码过滤结果 SELECT jmeno, prijmeni, adresa, vozidlo.spz, snimek.timestamp FROM majitel INNER JOIN vozidlo ON majitel.id_majitel = vozidlo.id_majitel INNER JOIN kat_kamera ON kat_kamera.id_kategorie = vozidlo.id_kategorie INNER JOIN snimek ON

我加入了几个表,并使用以下代码过滤结果

SELECT jmeno, prijmeni, adresa, vozidlo.spz, snimek.timestamp
FROM majitel
INNER JOIN vozidlo ON majitel.id_majitel = vozidlo.id_majitel
INNER JOIN kat_kamera ON kat_kamera.id_kategorie = vozidlo.id_kategorie
INNER JOIN snimek ON kat_kamera.id_kamera = snimek.id_kamera
WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
结果如下

jmeno   prijmeni    adresa  spz         timestamp
John    Doe         Prague  7A2 5109    17/05/2019 08:21
John    Doe         Prague  7A2 5109    17/05/2019 20:50
Vanessa Green       Pilsen  4P8 9370    17/05/2019 06:14
John    Doe         Prague  7A2 5109    17/05/2019 20:50
Vanessa Green       Pilsen  4P8 9370    17/05/2019 12:27
Vanessa Green       Pilsen  4P8 9370    17/05/2019 14:31
John    Doe         Prague  7A2 5109    18/05/2019 15:35
到目前为止,这种方法效果良好。问题是,我只想将结果限制为这些,它们出现3次或更多次

因此,我对查询进行了如下修改

SELECT jmeno, prijmeni, adresa, vozidlo.spz, snimek.timestamp
FROM majitel
INNER JOIN vozidlo ON majitel.id_majitel = vozidlo.id_majitel
INNER JOIN kat_kamera ON kat_kamera.id_kategorie = vozidlo.id_kategorie
INNER JOIN snimek ON kat_kamera.id_kamera = snimek.id_kamera
WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
HAVING COUNT(jmeno) >= 3
但不幸的是,这不起作用。因为它返回的就是这个

jmeno   prijmeni    adresa  spz         timestamp
John    Doe         Prague  7A2 5109    17/05/2019 08:21
但是在最终结果中应该既有约翰·多伊,也有瓦妮莎·格林


你能帮我得到想要的结果吗?

你应该使用group by和count(*)


并使用聚合函数来减少时间戳值(例如:min())

您需要一个
分组依据。MySQL允许使用
HAVING
子句,而不使用
groupby
。整个查询被视为聚合查询,只返回一行

如果您只需要重复零件:

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;
(我鼓励您限定所有列名,以便清楚它们来自哪些表。)

时间戳
更难包含。也许将它们连接到同一行就足够了:

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;

如果不想丢失每个时间戳的信息,可以使用
行号
存在
。试试这个:

WITH CTE AS
(
    SELECT 
         jmeno
        ,prijmeni
        ,adresa
        ,vozidlo.spz
        ,snimek.timestamp
        ,ROW_NUMBER() OVER (PARTITION BY jmeno ORDER BY jmeno) as number
    FROM majitel
    INNER JOIN vozidlo ON majitel.id_majitel = vozidlo.id_majitel
    INNER JOIN kat_kamera ON kat_kamera.id_kategorie = vozidlo.id_kategorie
    INNER JOIN snimek ON kat_kamera.id_kamera = snimek.id_kamera
    WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
)
SELECT
    *
FROM CTE
WHERE exists (
                SELECT 1
                FROM CTE
                where CTE.jmeno = jmeno
                and CTE.number >= 3
              )

我相信您的GROUP BY丢失了,如果您添加了它,您将需要稍微重写查询,作为一般的经验法则,select中的每个“列”也应该出现在GROUP BY子句中
jmeno
,并且
prijmeni
应该在它们的表中有一个主键(始终记得添加您的模式)。根据
id
对其进行分组以提高效率。如果不添加
分组依据
,则所有记录都将被视为相同的记录
WITH CTE AS
(
    SELECT 
         jmeno
        ,prijmeni
        ,adresa
        ,vozidlo.spz
        ,snimek.timestamp
        ,ROW_NUMBER() OVER (PARTITION BY jmeno ORDER BY jmeno) as number
    FROM majitel
    INNER JOIN vozidlo ON majitel.id_majitel = vozidlo.id_majitel
    INNER JOIN kat_kamera ON kat_kamera.id_kategorie = vozidlo.id_kategorie
    INNER JOIN snimek ON kat_kamera.id_kamera = snimek.id_kamera
    WHERE TIMESTAMP >= TIMESTAMP(NOW() - INTERVAL 2 DAY)
)
SELECT
    *
FROM CTE
WHERE exists (
                SELECT 1
                FROM CTE
                where CTE.jmeno = jmeno
                and CTE.number >= 3
              )