【问题标题】:PHP MySQL short query assoc codePHP MySQL 短查询关联代码
【发布时间】:2017-04-22 13:09:31
【问题描述】:

我需要查询和关联许多这样的查询

<?php 
$datacenter=mysqli_connect('localhost','user','pass','db');

db 连接,现在我们计算选项 1 和 2 和 3 的投票数

 $r11=mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total1` 
FROM `votes` WHERE `firstvote` = '1' ");
    $r11r=mysqli_fetch_assoc($r11);


    $r12=mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total2` 
FROM `votes` WHERE `firstvote` = '2'");
    $r12r=mysqli_fetch_assoc($r12);

    $r13=mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total3` 
FROM `votes` WHERE `firstvote` = '3'");
    $r13r=mysqli_fetch_assoc($r13);
    ?>

现在我们回显结果以显示选项 1、2 和 3 的投票数

<?php echo number_format($r11r['total1'],0,',','.'); ?>
<? php echo number_format($r12r['total2'],0,',','.'); ?>
<? php echo number_format($r13r['total3'],0,',','.'); ?>

有什么办法可以缩短这段代码?我是 PHP 新手

【问题讨论】:

    标签: javascript php html css mysql


    【解决方案1】:

    您可以在查询中使用GROUP BY

    SELECT 
      firstvote,
      COUNT(*) AS count
    FROM votes
    GROUP BY firstvote
    

    您会到达所有唯一的firstvote,并且使用此值计算行数。 如果您只想为此 firstvote 选择值,您可以使用此查询:

    SELECT 
      firstvote,
      COUNT(*) AS count
    FROM votes
    WHERE firstvote IN (1, 2, 3)
    GROUP BY firstvote
    

    要按计数对值进行排序,您可以使用ORDER BY

    SELECT 
      firstvote,
      COUNT(*) AS count
    FROM votes
    GROUP BY firstvote
    ORDER BY count DESC
    LIMIT 3
    

    DESC 一开始就意味着更大。

    【讨论】:

    • 我又有点慢了 ;-)
    • 这个答案很好,如果我只想显示更高票数的结果怎么办?示例选项 3 有 78 个结果,选项 2 有 204 个结果,选项 1 有 24 个结果。然后我想只显示选项 2 的结果,因为是 204 票的高票
    【解决方案2】:
    foreach(array(1,2,3) as $firstvote){
      $res=mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total` 
                                      FROM `votes` WHERE `firstvote` = '$firstvote' ");
      $r[$firstvote]=mysqli_fetch_assoc($res);
     }
    
    foreach($r as $set){
      echo number_format($set['total'],0,',','.'); 
    }
    

    仅限高票:

    $r['total']=0;
    foreach(array(1,2,3) as $firstvote){
      $res=mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total` 
                                      FROM `votes` WHERE `firstvote` = '$firstvote' ");
      $tmp=mysqli_fetch_assoc($res);
      $r=max($tmp['total'],$r['total']);
     }
    
    
     echo number_format($r,0,',','.'); 
    

    因为我现在不是你真正想做的事情,所以这是一种只获得所有结果中最高价值的解决方案。但是您应该使用您的 SQL 查询来执行此操作。添加类似ORDER BY total LIMIT 1 的内容

    【讨论】:

    • 这个答案很好,如果我只想显示更高票数的结果怎么办?示例选项 3 有 78 个结果,选项 2 有 204 个结果,选项 1 有 24 个结果。然后我想只显示选项 2 的结果,因为是 204 票的高票
    • 它在 for(array(1,2,3) as $firstvote){
    • @caradevineros OH 错字将for 更改为foreach 更新了答案
    • 好的,这给我投票最多的总票数。我现在需要显示排名最高的名字,可以是选项 1 或 2 或 3。有什么想法吗?
    • 在这个查询中排名最高的是价值 2 的 47 票
    【解决方案3】:
    $result = mysqli_query($datacenter, "SELECT COUNT(firstvote) AS `total1` FROM `votes` WHERE `firstvote` in ('1','2','3') GROUP BY firstvote");
    
    while ($row = mysqli_fetch_assoc($result)) {
        echo number_format($row['total1'], 0, ',', '.');
    }
    

    【讨论】:

    • 这个答案很好,如果我只想显示更高票数的结果怎么办?示例选项 3 有 78 个结果,选项 2 有 204 个结果,选项 1 有 24 个结果。然后我想只显示选项 2 的结果,因为是 204 票的高票
    【解决方案4】:

    您可以使用 CASE 语法并在一个查询中完成所有操作

    $sql = "SELECT
                SUM(CASE WHEN `firstvote` = 1 THEN 1 ELSE 0 END) AS total1,
                SUM(CASE WHEN `firstvote` = 2 THEN 1 ELSE 0 END) AS total2,
                SUM(CASE WHEN `firstvote` = 3 THEN 1 ELSE 0 END) AS total3
            FROM `votes`";
    
    $res = mysqli_query($datacenter, $sql);
    $row = mysqli_fetch_assoc($res);
    
    echo number_format($row['total1'],0,',','.');
    echo number_format($row['total2'],0,',','.');
    echo number_format($row['total3'],0,',','.');
    

    这将在单个结果行中返回名为 total1 total2total3 的 3 列

    【讨论】:

    • 这个答案很好,如果我只想显示更高票数的结果怎么办?示例选项 3 有 78 个结果,选项 2 有 204 个结果,选项 1 有 24 个结果。然后我想只显示选项 2 的结果,因为是 204 票的高票
    • 你可以使用一些简单的 PHP 来做到这一点
    猜你喜欢
    • 2014-01-04
    • 2011-08-21
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    • 2014-05-04
    相关资源
    最近更新 更多