繁体   English   中英

基于多种因素的 MySQl 唯一计数

[英]MySQl Unique Count based on multiple factors

我需要根据 ip 和类别为我的网站计算不同的点击次数。

我能够计算不同的 ip,但无法获得不同的类别。 我有大约 250 个类别。

我正在这样做。

我的表结构。

 |id | category  |     ip     |    date    |
 | 1 |    234    | 1698170031 | 1457966671 |
 | 2 |    234    | 1698170032 | 1458041287 |
 | 3 |    233    | 1698170033 | 1458041298 |
 | 4 |    233    | 1698170034 | 1458041334 |
 | 5 |    102    | 1698170035 | 1458042584 |
 | 6 |    102    | 1698170036 | 1458042614 |
 | 7 |    102    | 1698170037 | 1458042865 |
 | 8 |    102    | 1698170038 | 1458043089 |
 | 9 |    102    | 1698170039 | 1458043171 |
 | 10|    102    | 1698170040 | 1458043181 |

SELECT COUNT(DISTINCT `ip`) AS `total` FROM `stats`.`hits`;
//this is working fine showing 10 hits 

SELECT COUNT(DISTINCT `ip`) AS `hits` FROM `stats`.`hits` GROUP BY `category`;
//this is not working showing 1 hit 

//expected result
category 234 = 2 hits
category 233 = 2 hits
category 102 = 6 hits

我还知道另一种获得不同类别点击量的方法

//adding to main query
.
.
COUNT(DISTINCT CASE WHEN `category` = '234' THEN `ip` END) `234`,
COUNT(DISTINCT CASE WHEN `category` = '233' THEN `ip` END) `233`,
.
.

但这将是很长的查询

请建议一种方法来获得 DISTINCT 类别计数。

谢谢

这是

SELECT 
category,
COUNT(DISTINCT ip)
FROM
hits
GROUP BY category;

就像你已经尝试过一样。 这不只返回 1 行。 你把事情搞砸了,我不知道,但这是解决方案。

证明(但懒得好好格式化):

root@localhost:playground > CREATE TABLE t
    ->     (`id` int, `category` int, `ip` int, `date` int)
    -> ;

INSERT INTO t
    (`id`, `category`, `ip`, `date`)
VALUES
    (1, 234, 1698170031, 1457966671),
    (2, 234, 1698170032, 1458041287),
    (3, 233, 1698170033, 1458041298),
    (4, 233, 1698170034, 1458041334),
    (5, 102, 1698170035, 1458042584),
    (6, 102, 1698170036, 1458042614),
    (7, 102, 1698170037, 1458042865),
Query OK, 0 rows affected (0.02 sec)

root@localhost:playground >
root@localhost:playground > INSERT INTO t
    ->     (`id`, `category`, `ip`, `date`)
    -> VALUES
    ->     (1, 234, 1698170031, 1457966671),
    ->     (2, 234, 1698170032, 1458041287),
    ->     (3, 233, 1698170033, 1458041298),
    ->     (4, 233, 1698170034, 1458041334),
    ->     (5, 102, 1698170035, 1458042584),
    ->     (6, 102, 1698170036, 1458042614),
    ->     (7, 102, 1698170037, 1458042865),
    ->     (8, 102, 1698170038, 1458043089),
    ->     (9, 102, 1698170039, 1458043171),
    ->     (10, 102, 1698170040, 1458043181)
    -> ;
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0

root@localhost:playground > SELECT
    -> category,
    -> COUNT(DISTINCT ip)
    -> FROM
    -> t
    -> GROUP BY category;
+----------+--------------------+
| category | COUNT(DISTINCT ip) |
+----------+--------------------+
|      102 |                  6 |
|      233 |                  2 |
|      234 |                  2 |
+----------+--------------------+
3 rows in set (0.00 sec)

循环怎么样(我将使用 PDO 表示法)

$query = $dbc->prepare("SELECT DISTINCT category FROM stats");
$query->execute();
while ($category = $query->fetch(PDO::FETCH_ASSOC))
{
$countquery = $dbc->prepare("SELECT COUNT(DISTINCT CASE WHEN category = :category THEN ip END");
$countquery->bindParam(':category', $category);
$countquery->execute();
echo "(results of query here)";
}

这是您的查询

SELECT COUNT(DISTINCT ip ) AS hits FROM stats hits GROUP BY category

//这不起作用显示1次命中

它需要小的修改

SELECT COUNT(DISTINCT ip ) FROM table_name GROUP BY category ;

+----------------------+

| COUNT(DISTINCT ip ) |

+----------------------+

| 6 |

| 2 |

| 2 |

+----------------------+

3 行(0.00 秒)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM