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

时间:2014-06-11 02:50:47

标签: php mysql

首先我要说的是,我只是一个自学成才的爱好者,所以我确定我做错了一些事情或者做得不够,所以任何反馈都会受到赞赏。如果这个问题没有实际意义,因为我已经犯了根本性的错误,需要从头开始,我想我需要知道,所以我会变得更好。

有了这个,这就是问题所在:

我在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_query($dbcnx, $query)
   or die ("Error in query: $query.".mysqli_error($dbcnx));
$rows = $result->num_rows;
echo "<br>You found $rows names!<br>";
while($row=mysqli_fetch_assoc($result))
{
 echo '<br>'.$row['Name'];
    }

1 个答案:

答案 0 :(得分:0)

我认为您必须考虑以不同的方式构建数据,以便充分利用RDBMS。

如果是我,我会考虑在第一个实例中将数据规范化到不同的表中并处理不必要的字段,例如&#34;开始&#34;和#34;人气&#34;。可以在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)

将数据分离出来的美妙之处在于查询它变得更加容易。所以,如果你想要在1987年和1988年之间出现Aaron这个名字的频率,你可以做如下的事情:

SELECT SUM(frequencies.number) FROM frequencies WHERE frequencies.yearID 
BETWEEN 1987 AND 1988 
AND frequencies.nameID = 1

此外,取消了&#34;开始&#34;列意味着您可以构建查询以使用&#34; LIKE&#34;

SELECT * FROM names WHERE name LIKE "A%"

我的例子可能有点做作,但希望它们可以说明我所得到的。

我还没有触及的一件事是你如何实际输入数据。添加新名称后会发生什么?是否自动在频率表中输入相应的条目?是否首先在频率表中执行检查,如果存在条目,它是否会自动增加数量?

这些是需要考虑的重要问题,但最好在架构确定之后才能完成。