MySQL - 对每个 col 中最常见的数字求和,显示 col 总和在 185 到 215 之间的结果

标签 mysql numbers sum between

我为我的 PowerBall 游戏设置了以下 sql 查询。我不得不将它分成 2 个查询,因为必须单独查询 PowerBall 号码。

我需要帮助的是如何总结所有列(NoA、NoB、NoC、NoD、NoE 和 NoPB)并让它显示最常见的一组 6 个数字,其中所有列的总数介于185 和 215。

举个例子,假设排名靠前的随机数是:1、10、30、15、6 和 20。它们的总和是 82。我不希望它出现,因为所有列不在 185 到 215 之间。

这是我目前的代码片段:

<code>
$sql = mysql_query("SELECT NoA, COUNT(*) AS Occurences FROM
(SELECT NoA FROM Numbers
UNION ALL
SELECT NoB FROM Numbers
UNION ALL
SELECT NoC FROM Numbers
UNION ALL
SELECT NoD FROM Numbers
UNION ALL
SELECT NoE FROM Numbers) t
GROUP BY NoA
ORDER BY Occurences DESC
LIMIT 5;");

while($row = mysql_fetch_array($sql))
{
echo "<tr>" . $row['NoA'] . "&nbsp;</tr>";
echo "<tr>" . $row['NoB'] . "&nbsp;</tr>";
echo "<tr>" . $row['NoC'] . "&nbsp;</tr>";
echo "<tr>" . $row['NoD'] . "&nbsp;</tr>";
echo "<tr>" . $row['NoE'] . "&nbsp;</tr>";
}
$sql2 = mysql_query("SELECT NoPB, COUNT(*) AS Occurences
FROM Numbers
GROUP BY NoPB
ORDER BY Occurences DESC
LIMIT 1;");
while($row2 = mysql_fetch_array($sql2))
{ 
echo "<font style='color: #FF0000;'><tr>" . $row2['NoPB'] . "</tr><br /><br /></font>";
}
</code>

预先感谢您的帮助!

杰罗姆

最佳答案

FROM 子句中的子查询对“No*”列求和并将结果限制在 185 到 215 之间,然后主查询对总和进行分组,计算相似的总和,降序排列然后限制为最大的 6。

SELECT snum, count(*) AS cc
    FROM (
        SELECT NoA + NoB + NoC + NoD + NoE + NoPB AS snum
            FROM Numbers
            WHERE NoA + NoB + NoC + NoD + NoE + NoPB > 185 
              AND NoA + NoB + NoC + NoD + NoE + NoPB < 215
    ) AS subnumquery
    GROUP BY snum
    ORDER BY cc DESC
    LIMIT 5;

给我:

+------+----+
| snum | cc |
+------+----+
|  209 |  3 |
|  206 |  2 |
|  207 |  1 |
|  192 |  1 |
+------+----+

这离您的目标还有多远?

或者这就是您要找的东西?

SELECT CONCAT(NoA, ',', NoB, ',', NoC, ',', NoD, ',', NoE, ',', NoPB) AS allnum
    , sumnum, count(*) AS cc
    FROM (
        SELECT NoA, NoB, NoC, NoD, NoE, NoPB, 
            NoA + NoB + NoC + NoD + NoE + NoPB AS sumnum
            FROM Numbers
            WHERE NoA + NoB + NoC + NoD + NoE + NoPB > 185 
              AND NoA + NoB + NoC + NoD + NoE + NoPB < 215
    ) AS subnumquery
    GROUP BY allnum
    ORDER BY cc DESC
    LIMIT 5;

给我:

+-----------------+--------+----+
| allnum          | sumnum | cc |
+-----------------+--------+----+
| 6,8,3,77,32,83  |    209 |  3 |
| 9,9,50,61,39,38 |    206 |  2 |
| 2,26,7,53,28,76 |    192 |  1 |
| 57,52,2,3,10,83 |    207 |  1 |
+-----------------+--------+----+

这是我的测试数据库设置:

CREATE TABLE `Numbers` (
  `NoA` int(11) DEFAULT NULL,
  `NoB` int(11) DEFAULT NULL,
  `NoC` int(11) DEFAULT NULL,
  `NoD` int(11) DEFAULT NULL,
  `NoE` int(11) DEFAULT NULL,
  `NoPB` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `Numbers` VALUES (28,15,30,73,82,37),(51,74,28,14,28,93),(6,8,3,77,32,83),(81,80,14,5,83,92),(9,9,50,61,39,38),(33,9,15,6,27,92),(51,74,28,14,28,93),(6,8,3,77,32,83),(51,74,28,14,28,93),(57,52,2,3,10,83),(33,9,15,6,27,92),(51,74,28,14,28,93),(28,15,30,73,82,37),(75,16,2,45,20,83),(9,9,50,61,39,38),(51,74,28,14,28,93),(33,9,15,6,27,92),(2,26,7,53,28,76),(77,34,11,56,20,83),(51,74,28,14,28,93),(6,8,3,77,32,83),(33,9,15,6,27,92),(51,74,28,14,28,93);

关于MySQL - 对每个 col 中最常见的数字求和,显示 col 总和在 185 到 215 之间的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24330534/

相关文章:

php - laravel4 CSV 路由帮助

java - 如何在java中用指数表示较小的Double变量

javascript - 如何将概率(均匀递增或递减线性分布)分配给值数组?

python - 如何在 Python 中创建 N 元组?

r - 如何对 "Origin-Destination"数据帧进行分组求和?

mysql - DATEDIFF 与 DATEADD 导致 MySQL 查询性能下降

mysql - 用户 'ODBC' @'localhost' < 使用密码 : YES> 的访问被拒绝

mysql - 如何将值传递给 mySQL 嵌套子查询?

python-3.x - 数组的列求和 - 两种方法,两种不同的结果

matrix - 解决错误类型参数 'cell'