Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.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:计算用户可选择年份范围的总计_Php_Mysql - Fatal编程技术网

Php MySQL:计算用户可选择年份范围的总计

Php MySQL:计算用户可选择年份范围的总计,php,mysql,Php,Mysql,首先,我要说的是,我只是一个自学成才的业余爱好者,所以我确信我做了一些错事或不恰当的事情,所以任何反馈都是非常感谢的。如果这个问题是没有意义的,因为我犯了基本错误,需要从头开始,我想我需要知道,这样我会变得更好 这样一来,问题就来了: 我在MySQL中有一个出生人名数据库,旨在让您查找给定年份范围内出生人名的频率。我唯一的表有很多列: **Name** **Begins** **Popularity** **1800** **1801** **1802** Aaron

首先,我要说的是,我只是一个自学成才的业余爱好者,所以我确信我做了一些错事或不恰当的事情,所以任何反馈都是非常感谢的。如果这个问题是没有意义的,因为我犯了基本错误,需要从头开始,我想我需要知道,这样我会变得更好

这样一来,问题就来了:

我在MySQL中有一个出生人名数据库,旨在让您查找给定年份范围内出生人名的频率。我唯一的表有很多列:


**Name**    **Begins**  **Popularity**   **1800**  **1801**  **1802**
Aaron            A           500             6         7         4
Amy              A           100            10         2         12
Ashley           A           250             2         5         7
…等等,直到2013年

现在我已经写了一个PHP页面,可以根据整个年份(1800-2013年)的起始字母调用一个姓名列表。这是可行的,但我想做的是让用户从我在主页上的下拉列表中指定一个自定义年份范围,并使用它来计算自定义年份范围内每个名称的频率。我还希望能够根据这些频率值对结果列表进行排序,而不是“流行度”中存储的所有时间频率

从我所看到的情况来看,我认为解决方案的一部分可能在于使用自定义视图,但我似乎无法将各个部分放在一起。还是我应该预先计算所有可能的组合

下面是我现在正在使用的工作查询代码:

{$query = "SELECT Name
FROM nametable
WHERE Gender = '$genselect'
AND 
(BeginsWith = '$begins')
ORDER BY $sortcolumn $sortorder";
goto resultspage;
}

resultspage:
$result=mysqli\u查询($dbcnx,$query)
或者死(“查询中的错误:$query.”.mysqli_错误($dbcnx));
$rows=$result->num_行;
echo“
您找到了$rows名称!
”; while($row=mysqli\u fetch\u assoc($result)) { 回显“
”.$row['Name']; }
<>代码> 我想你将不得不考虑以不同的方式构造数据以充分利用RDBMS。

如果是我,我会首先考虑将数据规范化到不同的表中,并处理不必要的字段,如“开始”和“流行度”。这种信息可以很容易地在PHP中或在查询本身中复制或查找。这里的优点是,还可以减少实际需要维护的列数

我还没有制定出一个银弹模式,但大致上,我会从以下几点开始,并在适当的地方展开/修改:

Names
- id
- name
- genderID

Genders
- id
- code

Years
- id

Frequencies
- id
- nameID
- yearID
- number
因此,例如,您的数据段可能具有以下形状:

Names (1, Aaron, 1)
Genders (1, Male)
Years (1987)
Frequencies (1, 1, 1987, 6), (1, 1, 1988, 19)
像这样将数据分离出来的好处是,查询数据变得容易多了。因此,如果你想知道Aaron这个名字在1987年到1988年间出现的频率,你可以做如下的事情:

SELECT SUM(frequencies.number) FROM frequencies WHERE frequencies.yearID 
BETWEEN 1987 AND 1988 
AND frequencies.nameID = 1
此外,去掉“Begins”列意味着您可以使用“LIKE”来构造查询

我的例子也许有点做作,但希望它们能说明我的意思

有一件事我还没有提到,那就是你可能会如何实际地输入数据。添加新名称时会发生什么情况?是否自动在频率表中输入相应的条目?是否首先在频率表中执行检查,如果存在条目,是否自动增加该数字


这些都是需要考虑的重要问题,但最好是在一个模式被解决之后留下。

如果我读对了,听起来你有一个有几百个列的巨型表。如果是这样,您真的应该研究数据库规范化。在进入这条路径之前,您当前如何输入名称和值?它们是从电子表格还是类似的东西中导入的?是的,我是从电子表格制作的CSV中导入的。我一直这样做是因为我对Excel函数比MySQL函数更熟悉,所以我在那里操作数据并在完成后导出值。你会继续以这种方式导入数据,还是打算使用某种web界面来添加新名称?我假设当下一年的数据出现时,我会更新电子表格,然后重新导入整个内容。
SELECT SUM(frequencies.number) FROM frequencies WHERE frequencies.yearID 
BETWEEN 1987 AND 1988 
AND frequencies.nameID = 1
SELECT * FROM names WHERE name LIKE "A%"