[英]Calculating possibilities PHP, MySqli
我那一天有6个数字的表格。
1 5 8 14 35 45 Mon
13 26 30 31 43 49 Sat
1 4 13 19 34 39 Wed
2 20 21 24 25 43 Mon
1 6 31 33 39 45 Sat
2 11 16 21 25 28 Wed
17 21 24 37 46 48 Mon
6 10 11 22 28 33 Sat
3 10 23 30 38 45 Wed
我正在尝试创建一个脚本,该脚本将为我提供当天重复的最多6个数字。
下面的脚本将为我提供在第一列中重复的所有数字。
$query = mysqli_query($connect_db,"SELECT first, COUNT(first) AS ct
FROM numbers
GROUP BY first
ORDER BY first DESC");
while($row = mysqli_fetch_array($query)){
echo '<table class="first"><tr><td>'. $row[1].'</td><tr></table>';
}
但我只需要6个重复次数最高的数字。
数据库:
好吧,我想我现在已经明白了这个问题。 尝试这个。
$numLabels = array('first', 'second', 'third', 'fourth', 'fifth', 'sixth');
$numbers= array();
$query = "SELECT * FROM numbers";
$rows = mysqli_query($link, $query);
if ($rows) {
while ($row = mysqli_fetch_assoc($rows)) {
//indexing all the numbers and counting occurrences
foreach ($numLabels as $label) {
if (isset($numbers[$row['day']][$row[$label]])) {
$numbers[$row['day']][$row[$label]] ++;
} else {
$numbers[$row['day']][$row[$label]] = 1;
}
}
}
mysqli_free_result($rows);
//sorting by occurrences
foreach (array_keys($numbers) as $key) {
arsort($numbers[$key]);
}
//getting the most common 6
foreach ($numbers as $day => $dayNumbers) {
$numbers[$day] = array_slice(array_keys($dayNumbers), 0, 6);
}
}
//example output format: "Day: num1-num2-num3..."
foreach ($numbers as $day => $dayNumbers) {
echo $day . ': ' . implode('-', $dayNumbers) . '<br />';
}
您使用六列来表示本质上是单个属性的内容。 这就是为什么您想要的结果如此难以实现的原因。 查询是,如果你的表是标准化要简单得多 。 这是一种可能的表设计,它比当前表更规范化 :
+-----+--------+----------+-----+
| id | number | position | day |
+-----+--------+----------+-----+
| 1 | 1 | 1 | Mon |
| 1 | 5 | 2 | Mon |
| 1 | 8 | 3 | Mon |
| 1 | 14 | 4 | Mon |
| 1 | 35 | 5 | Mon |
| 1 | 45 | 6 | Mon |
| 2 | 13 | 1 | Sat |
| 2 | 26 | 2 | Sat |
| 2 | 30 | 3 | Sat |
| 2 | 31 | 4 | Sat |
| ... | ... | ... | ... |
+-----+--------+----------+-----+
使用此表,每天按频率对数字进行排序很简单:
SELECT
day,
number,
COUNT(number) AS count
FROM
table
GROUP BY day
ORDER BY COUNT(number) DESC;
有关在上述查询中将结果限制在每个组内的深入讨论,可以阅读如何在SQL中选择每个组的第一行/最少行/最大行 。 鉴于您似乎只有三个可能的day
值要分组(在任何情况下,最多七个),因此UNION
方法可能是最佳选择。
(SELECT number, day FROM table WHERE day='Mon'
GROUP BY day ORDER BY COUNT(number) DESC LIMIT 6)
UNION ALL
(SELECT number, day FROM table WHERE day='Wed'
GROUP BY day ORDER BY COUNT(number) DESC LIMIT 6)
UNION ALL
(SELECT number, day FROM table WHERE day='Sat'
GROUP BY day ORDER BY COUNT(number) DESC LIMIT 6)
您可能希望在(day, number)
上使用复合索引以获得最佳性能。 使用此解决方案,您可以避免将整个表从数据库传输到PHP脚本的开销。 随着表格大小的增加,这一点变得越来越重要。 SELECT * FROM table
是一种非常强烈的代码味道。
还有其他方法可以设计标准化表格来存储此类数据。 例如,我宁愿存储日历日期并从中得出星期几,而不是仅存储星期几的缩写。 但是最主要的是将数字归为一个单一的属性,这样您就可以将它们视为同质数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.