Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/288.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
Php Mysql从stats数据库获取多个计数_Php_Mysql - Fatal编程技术网

Php Mysql从stats数据库获取多个计数

Php Mysql从stats数据库获取多个计数,php,mysql,Php,Mysql,我需要获得每个用户的唯一计数以及国家计数和总和率 我提出了这个基本的数据库设计,其中uid是用户id DROP TABLE IF EXISTS `stats`; CREATE TABLE IF NOT EXISTS `stats` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `uid` int(5) UNSIGNED NOT NULL, `country` int(3) UNSIGNED NOT NULL, `ip` int(

我需要获得每个用户的唯一计数以及国家计数和总和率

我提出了这个基本的数据库设计,其中uid是用户id

DROP TABLE IF EXISTS `stats`;
CREATE TABLE IF NOT EXISTS `stats` (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `uid` int(5) UNSIGNED NOT NULL,
  `country` int(3) UNSIGNED NOT NULL,
  `ip` int(10) UNSIGNED NOT NULL,
  `date` int(10) UNSIGNED NOT NULL,
  `timestamp` int(10) UNSIGNED NOT NULL,
  `rate` int(10) UNSIGNED NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

INSERT INTO `stats` 
(`id`, `uid`, `country`, `ip`, `date`, `timestamp`, `rate`) VALUES
(1, 1, 10, 1111111111, 2222222222, 3333333333, 100),
(2, 1, 10, 1111111112, 2222222222, 3333333333, 100),
(3, 2, 10, 1111111111, 2222222222, 3333333333, 100),
(4, 1, 10, 1111111114, 2222222223, 3333333333, 100),
(5, 1, 11, 1111111112, 2222222223, 3333333333, 100),
(6, 1, 10, 1111111111, 2222222223, 3333333333, 100);
这是我用来获取每日计数的查询

$query="
SELECT `uid`,
COUNT(DISTINCT `ip`)AS `count`, 
`country`, 
SUM(`rate`) AS `sum`,
`date`
FROM `stats` 
GROUP BY `uid`, `date`
";
$result=mysqli_query($connection, $query) or trigger_error(mysqli_error($connection), E_USER_ERROR);
while($row = mysqli_fetch_assoc($result)){
echo 'userid:'.$row['uid'].' count:'.$row['count'].' country:'.$row['country'].' sum:'.$row['sum'].' date:'.$row['date'].'<br>';
};
预期结果

userid:1 count:2 country:10=>2        sum:200 date:2222222222
userid:1 count:3 country:10=>2, 11=>1 sum:300 date:2222222223
userid:2 count:1 country:10=>1        sum:100 date:2222222222
我想我需要像从统计中选择不同的国家这样的东西来获得主查询中的国家计数

请查看并建议任何可能的方法


谢谢

SUM需要一列,而您在其中提供了字符串“rate”,请删除“from rate”列名称,然后尝试此操作

SELECT 
   COUNT(DISTINCT `ip`)AS `count`, 
  `country`, 
  SUM(rate) AS `sum` 
  FROM `stats` 
  GROUP BY `uid`, `date`

SUM需要一个列,您在其中指定了字符串“rate”,请删除“from rate”列名称,然后重试此操作

SELECT 
   COUNT(DISTINCT `ip`)AS `count`, 
  `country`, 
  SUM(rate) AS `sum` 
  FROM `stats` 
  GROUP BY `uid`, `date`
您还必须将国家/地区添加到组条件中:

SELECT
    COUNT(DISTINCT `ip`) AS `count`,
    `country`,
    COUNT(`country`) as `countryViewsByUser`,   -- added
    SUM(`rate`)AS `sum`
FROM
    `stats`
GROUP BY
    `uid`,
    `date`,
    `country`   -- added
您还必须将国家/地区添加到组条件中:

SELECT
    COUNT(DISTINCT `ip`) AS `count`,
    `country`,
    COUNT(`country`) as `countryViewsByUser`,   -- added
    SUM(`rate`)AS `sum`
FROM
    `stats`
GROUP BY
    `uid`,
    `date`,
    `country`   -- added

您只需要通过下面这样的子句将国家添加到您的组中

$query="
SELECT 
COUNT(DISTINCT `ip`)AS `count`, 
`country`,
COUNT(DISTINCT `country`) AS country_count, 
SUM(`rate`) AS `sum` 
FROM `stats` 
GROUP BY `country`, `uid`, `date`
";

请您离开mysqli_*函数,转而看看

您只需要通过下面的子句将国家添加到您的组中

$query="
SELECT 
COUNT(DISTINCT `ip`)AS `count`, 
`country`,
COUNT(DISTINCT `country`) AS country_count, 
SUM(`rate`) AS `sum` 
FROM `stats` 
GROUP BY `country`, `uid`, `date`
";

请您离开mysqli_*函数,转而看看

您可以使用子查询来实现这一点:

选择 t、 uid, 算作计数, 组_concatt.country,'=>',t.views SEPARATOR',作为国家, SUMt.sum作为sum, t、 日期 从…起 选择 s、 uid, 将s.ip作为计数, s、 国家,, 以国家为视角, 总金额, s、 日期 从统计数字s 按uid、日期、国家/地区分组 AS t 分组 t、 uid, t、 日期
也可以在。

上找到。您可以使用子查询来实现这一点:

选择 t、 uid, 算作计数, 组_concatt.country,'=>',t.views SEPARATOR',作为国家, SUMt.sum作为sum, t、 日期 从…起 选择 s、 uid, 将s.ip作为计数, s、 国家,, 以国家为视角, 总金额, s、 日期 从统计数字s 按uid、日期、国家/地区分组 AS t 分组 t、 uid, t、 日期

也可在上找到。

谢谢,这是一个输入错误,这是求和,但我仍然需要国家/地区计数。这是一个输入错误,这是求和,但我仍然需要国家/地区计数。这为同一天提供了额外的一行,我需要一天中的所有数据。userid:1 count:2 count:10 sum:200 userid:1 count:2 count:10 sum:200 userid:1 count:1 count:11 sum:100 userid:2 count:1 count:10 sum:100它给出了4行,这就是您的数据将给出的。第1天2行,第2天2行。这为同一天提供了一个额外的行,我需要一天一行中的所有数据。userid:1计数:2国家:10总和:200 userid:1计数:2国家:10总和:200 userid:1计数:1国家:11总和:100 userid:2计数:1国家:10总和:100它提供了4行,这就是您的数据。第1天2行,第2天2行。它不会在一行中显示用户的所有数据,而是在两行中显示用户的所有数据。它不会在一行中显示用户的所有数据,而是在两行中显示用户的所有数据。您是否也要计算不同的国家?@是的,但对于任何用户,结果应该在一天的一行中显示,并且您如何知道哪个日期对应于哪个日期result@Strawberry 我有一个日期栏,我用它在分组中,但它不在选择栏中,是吗。我的感觉是,如果你想一想,你将自己解决所有这些问题。你还想计算不同的国家吗?@草莓是的,但结果应该以一行的形式显示给任何用户,从一天开始,你如何知道哪个日期对应哪个日期result@Strawberry我有一个日期栏,我用它在分组中,但它不在选择栏中,是吗。我的感觉是,如果你想一想,你会发现如何为自己解决所有这些问题这正是我所需要的,我还想知道它是否能正确且频繁地处理数百万行,这样数据库就不会变慢。性能取决于将多少行分组在一个行中。MySQL将首先执行子查询。然后对结果数据集执行外部查询。若第一个查询返回许多行,那个么第二个查询将花费大量时间。如果第一个分组查询返回的行数很少,那么第二个查询会很快,几乎不会影响总的执行时间。因此,这意味着对于有许多用户的数百万行来说,它会很慢。这正是我所需要的,我还想知道它是否能正确且频繁地处理数百万行,这样数据库就不会变慢。性能取决于将多少行分组到一个行中。MySQL将首先执行子查询。然后对结果数据集执行外部查询。若第一个查询返回许多行,那个么第二个查询将花费大量时间。如果第一个分组查询返回的行数很少,那么第二个查询将很快,并且几乎不影响总的执行时间。这意味着对于数百万个有多个用户的行,它将很慢