繁体   English   中英

计算可能性PHP,MySqli

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM