php - 根据过去 30 天的平均值对两个表进行排序

标签 php mysql

在解决我的编码挑战时,我已经求助于您的洞察力很长时间了。我终于被难住了,经过 12 小时的尝试,我必须向专家提出我自己的问题。如果您能提供任何指导,我将不胜感激。

我有两个 mysql 表; POLLS 表有一个民意调查列表,DATA 表是这些民意调查中的数据。我试图按照过去 30 天的平均值确定的顺序列出候选人。

表格投票

poll_id  |  poll_name  |  poll_date
_________|_____________|___________
6        |   poll 6    | 2015-08-22
5        |   poll 5    | 2015-08-14
4        |   poll 4    | 2015-08-09
3        |   poll 3    | 2015-08-02
2        |   poll 2    | 2015-07-28
1        |   poll 1    | 2015-07-20

表格数据

data_id | data_key | candidate | percent
________|__________|___________|________
1       |   1      |   Joe     |  18
2       |   1      |   Sue     |  19
3       |   1      |   Joy     |  15
4       |   1      |   Tim     |  16
5       |   2      |   Joe     |  20
6       |   2      |   Sue     |  19
7       |   2      |   Joy     |  19
8       |   2      |   Tim     |  22
9       |   3      |   Joe     |  14
10      |   3      |   Sue     |  16
11      |   3      |   Joy     |  21
12      |   3      |   Tim     |  15
13      |   4      |   Joe     |  14
14      |   4      |   Sue     |  15
15      |   4      |   Joy     |  20
16      |   4      |   Tim     |  15
17      |   5      |   Joe     |  17
18      |   5      |   Sue     |  14
19      |   5      |   Joy     |  15
20      |   5      |   Tim     |  16
21      |   6      |   Joe     |  17
22      |   6      |   Sue     |  19
23      |   6      |   Joy     |  16
24      |   6      |   Tim     |  18

这是我正在寻找的表格结果。它包含表 DATA 中的投票百分比,但候选人是根据过去 30 天的平均百分比按顺序列出的。

candidate | poll 6 | poll 5 | poll 4 | poll 3 | poll 2
__________|________|________|________|________|_______
Joy       | 16     | 15     | 20     | 21     | 19
Tim       | 18     | 16     | 15     | 15     | 22
Sue       | 19     | 14     | 15     | 16     | 19
Joe       | 17     | 17     | 14     | 14     | 20

我很困惑,我什至不知道从哪里开始了。我尝试了很多可能性,但只能让它们根据候选人姓名排序。

感谢您的时间和帮助。

最佳答案

例如……

DROP TABLE IF EXISTS polls;

CREATE TABLE polls
(poll_id  INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,poll_name  VARCHAR(12) NOT NULL
,poll_date DATE NOT NULL
);

INSERT INTO polls VALUES
(6        ,'poll 6','2015-08-22'),
(5        ,'poll 5','2015-08-14'),
(4        ,'poll 4','2015-08-09'),
(3        ,'poll 3','2015-08-02'),
(2        ,'poll 2','2015-07-28'),
(1        ,'poll 1','2015-07-20');

DROP TABLE IF EXISTS data;

CREATE TABLE data
(data_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
,poll_id INT NOT NULL
,candidate VARCHAR(12) NOT NULL
,percent INT NOT NULL
);

INSERT INTO data VALUES
( 1,1,'Joe',18),
( 2,1,'Sue',19),
( 3,1,'Joy',15),
( 4,1,'Tim',16),
( 5,2,'Joe',20),
( 6,2,'Sue',19),
( 7,2,'Joy',19),
( 8,2,'Tim',22),
( 9,3,'Joe',14),
(10,3,'Sue',16),
(11,3,'Joy',21),
(12,3,'Tim',15),
(13,4,'Joe',14),
(14,4,'Sue',15),
(15,4,'Joy',20),
(16,4,'Tim',15),
(17,5,'Joe',17),
(18,5,'Sue',14),
(19,5,'Joy',15),
(20,5,'Tim',16),
(21,6,'Joe',17),
(22,6,'Sue',19),
(23,6,'Joy',16),
(24,6,'Tim',18);

SELECT d.candidate
     , p.poll_name
     , d.percent
     , 30_day_avg
  FROM polls p
  JOIN data d
    ON d.poll_id = p.poll_id
  JOIN (SELECT candidate, AVG(percent) 30_day_avg FROM polls p JOIN data d ON d.poll_id = p.poll_id WHERE poll_date >= CURDATE() - INTERVAL 30 day GROUP BY candidate) x
    ON x.candidate = d.candidate
 WHERE p.poll_date >= CURDATE() - INTERVAL 30 day
 ORDER
    BY 30_day_avg DESC, candidate, p.poll_id DESC;
+-----------+-----------+---------+------------+
| candidate | poll_name | percent | 30_day_avg |
+-----------+-----------+---------+------------+
| Joy       | poll 6    |      16 |    18.2000 |
| Joy       | poll 5    |      15 |    18.2000 |
| Joy       | poll 4    |      20 |    18.2000 |
| Joy       | poll 3    |      21 |    18.2000 |
| Joy       | poll 2    |      19 |    18.2000 |
| Tim       | poll 6    |      18 |    17.2000 |
| Tim       | poll 5    |      16 |    17.2000 |
| Tim       | poll 4    |      15 |    17.2000 |
| Tim       | poll 3    |      15 |    17.2000 |
| Tim       | poll 2    |      22 |    17.2000 |
| Sue       | poll 6    |      19 |    16.6000 |
| Sue       | poll 5    |      14 |    16.6000 |
| Sue       | poll 4    |      15 |    16.6000 |
| Sue       | poll 3    |      16 |    16.6000 |
| Sue       | poll 2    |      19 |    16.6000 |
| Joe       | poll 6    |      17 |    16.4000 |
| Joe       | poll 5    |      17 |    16.4000 |
| Joe       | poll 4    |      14 |    16.4000 |
| Joe       | poll 3    |      14 |    16.4000 |
| Joe       | poll 2    |      20 |    16.4000 |
+-----------+-----------+---------+------------+

不幸的是,PHP 不是我的强项,但这里有一个示例,说明您可以如何在 PHP 中转换数组(从而“转换”结果)...

<?php

require('path/to/connection/stateme.nts');

$query = "
SELECT d.candidate
     , p.poll_name
     , d.percent
     , 30_day_avg
  FROM polls p
  JOIN data d
    ON d.poll_id = p.poll_id
  JOIN (SELECT candidate, AVG(percent) 30_day_avg FROM polls p JOIN data d ON d.poll_id = p.poll_id WHERE poll_date >= CURDATE() - INTERVAL 30 day GROUP BY candidate) x
    ON x.candidate = d.candidate
 WHERE p.poll_date >= CURDATE() - INTERVAL 30 day
 ORDER
    BY 30_day_avg DESC, candidate, p.poll_id DESC;
";

$result = mysqli_query($conn,$query);

$old_array = array();

while($row = mysqli_fetch_assoc($result)){

$old_array[] = $row;

}

$new_array = array();

foreach( $old_array as $v )
{
    if(!isset( $new_array[$v["candidate"]][$v["poll_name"]]))
    {
       $new_array[$v["candidate"]][($v["poll_name"])] = $v["percent"];
    }
}

print_r($new_array);

?> 

输出:

Array
(
    [Joy] => Array
        (
            [poll 6] => 16
            [poll 5] => 15
            [poll 4] => 20
            [poll 3] => 21
            [poll 2] => 19
        )

    [Tim] => Array
        (
            [poll 6] => 18
            [poll 5] => 16
            [poll 4] => 15
            [poll 3] => 15
            [poll 2] => 22
        )

    [Sue] => Array
        (
            [poll 6] => 19
            [poll 5] => 14
            [poll 4] => 15
            [poll 3] => 16
            [poll 2] => 19
        )

    [Joe] => Array
        (
            [poll 6] => 17
            [poll 5] => 17
            [poll 4] => 14
            [poll 3] => 14
            [poll 2] => 20
        )

)

希望从那里您可以弄清楚如何使用 html 和/或 css 构建漂亮的表格。

关于php - 根据过去 30 天的平均值对两个表进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32156003/

相关文章:

javascript - 使用 AJAX 调用将 GeoJSON 数据拉入 Leaflet

php - 使用 MediaWiki 1.16.0 实现添加媒体向导

php - 在窗口关闭时销毁 session ?

mysql - SQL 存储过程变量

mysql - 不使用循环更新 SQL 表的正确方法

mysql - 需要 ID 中的经理姓名

php - 更改 RockMongo 中的默认用户名/密码

php - src 与 require 或 include (path) 的区别

mysql - symfony2 : select from Table where start=today

MySQL - "view"表示特定单元格