Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/245.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.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 根据过去30天的平均值对两个表进行排序_Php_Mysql - Fatal编程技术网

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

Php 根据过去30天的平均值对两个表进行排序,php,mysql,Php,Mysql,很长一段时间以来,我一直在寻求您的见解来解决我的编码难题。我终于被难住了,经过12个小时的努力,我必须向大师提出我自己的问题。如果你能提供任何指导,我将不胜感激 我有两个mysql表;POLLS表有一个轮询列表,DATA table是这些轮询中的数据。我试着按照候选人在过去30天中的平均水平确定的顺序列出他们 candidate | poll 6 | poll 5 | poll 4 | poll 3 | poll 2 __________|________|________|________|_

很长一段时间以来,我一直在寻求您的见解来解决我的编码难题。我终于被难住了,经过12个小时的努力,我必须向大师提出我自己的问题。如果你能提供任何指导,我将不胜感激

我有两个mysql表;POLLS表有一个轮询列表,DATA table是这些轮询中的数据。我试着按照候选人在过去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
表格民意测验

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
这是我一直在寻找的表格结果。它包含表格数据中的民意调查百分比,但候选人是根据过去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);

?> 

希望您能从中了解如何使用html和/或css构建一个漂亮的表。

听起来您需要一个动态透视。谷歌“mysql动态枢轴”。谢天谢地,这是用
php
标记的,所以你可以避开动态枢轴。轮询id有点像数据键吗?嗨。是的,数据关键栏将数据与特定的民意测验联系起来,我非常欣赏答案,这肯定超出了我的能力,无法完全理解,但我会的。我简化了问题来解释,并插入了我真正的表名和列名,但是,它不起作用。我将根据您的数据构建新表,并对其进行剖析,直到我理解为止。你可以看到我现在的民意调查,按姓名排序,在这页的右边,我肯定这就是我想要的答案。非常感谢你。它一直运作得很好。我在将示例集成到原始表格中时仍然有点困难,但这只是一个尝试和错误的问题。谢谢你,草莓棒极了!如果PHP不是你的强项,我想看看它是什么。我不仅解决了挑战,还学到了很多。非常感谢。结果在这里-