Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Mysql按每个列字段上的每个值计数排序_Php_Mysql_Sql Order By - Fatal编程技术网

Php Mysql按每个列字段上的每个值计数排序

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, " ")

每个表字段都设置为00。我试图通过计算每个列字段中的每个00数字来找到订单的解决方案。下面的代码工作正常,但它是丑陋的,我不能命令的结果。谢谢

期望结果示例

它出现在列中的次数

01 - 100 02 - 99 03 - 98 柱样


如果没有更多的细节,按照您所寻找的内容,您将很难说出更多的最佳实践:

$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