Php Mysql按每个列字段上的每个值计数排序
每个表字段都设置为00。我试图通过计算每个列字段中的每个00数字来找到订单的解决方案。下面的代码工作正常,但它是丑陋的,我不能命令的结果。谢谢 期望结果示例 它出现在列中的次数 01 - 100 02 - 99 03 - 98 柱样Php Mysql按每个列字段上的每个值计数排序,php,mysql,sql-order-by,Php,Mysql,Sql Order By,每个表字段都设置为00。我试图通过计算每个列字段中的每个00数字来找到订单的解决方案。下面的代码工作正常,但它是丑陋的,我不能命令的结果。谢谢 期望结果示例 它出现在列中的次数 01 - 100 02 - 99 03 - 98 柱样 如果没有更多的细节,按照您所寻找的内容,您将很难说出更多的最佳实践: $stmt = $post_con->prepare('SELECT asw, count(asw) as count FROM tb WHERE CONCAT(" ", asw, " ")
如果没有更多的细节,按照您所寻找的内容,您将很难说出更多的最佳实践:
$stmt = $post_con->prepare('SELECT asw, count(asw) as count FROM tb WHERE CONCAT(" ", asw, " ") LIKE CONCAT("% ", ?, " %") GROUP BY asw ORDER BY count DESC LIMIT 1');
for ($i = 1; $i < 60; $i++) {
$stmt->bind_param(1, sprintf('%02d', $i));
$stmt->execute();
$obj = $stmt->fetchall(PDO::FETCH_ASSOC);
if (count($obj) !== 0) {
echo $de . '->' . $obj['count'] . '</br>';
}
}
$stmt->close();
您可以使用SQL为您做更多的工作。您可以将中的查询应用于您的情况 子查询将所有数字拆分为它们自己的行。它使用SELECT 1 UNION ALL。。。选择6以查找第一个数字,…,和第六个数字,并将每个数字放在自己的行中。请注意,您必须增加到6,因为每行有6个数字。如果有更多,则必须相应地调整查询 从这里开始,它就像按数字分组一样简单,计算唯一出现的次数,然后按数字升序排列
SELECT num, COUNT(num)
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(tb.asw, ' ', numbers.n), ' ', -1) num
FROM
(SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) AS numbers
INNER JOIN tb
ON CHAR_LENGTH(tb.asw)
-CHAR_LENGTH(REPLACE(tb.asw, ' ', ''))>=numbers.n-1
) numNumbers
GROUP BY num
ORDER BY num ASC
我想要更好的东西来取代这个“for循环”,并对结果进行排序。谢谢你!循环是好的。不要在循环中关闭stmt,否则会失去准备好的stmt的所有好处。取决于您要查找的是一组结果还是仅一个结果。此示例仅针对一个最高计数。它在查询中设置。desc或asc。取决于您需要什么。如果您希望对完整结果进行排序,请删除限制1。并在If计数中添加foreach whithin=0以回显每个值。请不要同时使用。对于数组,请坚持使用foreach。。。只要我的2美分-您是说1 tb中的示例行的值可能类似于00 01吗?2您要计算00、01……等的单独发生次数。在整张桌子上?因此,如果我的示例行是唯一一行,那么输出将是00->401->1?否。我想计算00或01的次数,并且六位数字中的每一位都出现在列中而不是字段中。谢谢@terminus您是否介意显示一些示例行,如3或4以及这些行的预期输出?也许可以在一个查询中完成这一切,但我需要看一个更完整的示例。当然,示例在问题中。结果应该是ex>01号出现X次,02号出现X次,依此类推。谢谢,我刚贴了一张专栏的照片。谢谢@Terminus
SELECT num, COUNT(num)
FROM (
SELECT
SUBSTRING_INDEX(SUBSTRING_INDEX(tb.asw, ' ', numbers.n), ' ', -1) num
FROM
(SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6
) AS numbers
INNER JOIN tb
ON CHAR_LENGTH(tb.asw)
-CHAR_LENGTH(REPLACE(tb.asw, ' ', ''))>=numbers.n-1
) numNumbers
GROUP BY num
ORDER BY num ASC