php - 按总票数排序结果

标签 php mysql voting

我正在构建一个投票系统。有两张表 - 一张用于 votes ,其他为items正在被投票表决。在此示例中,项目是线程。

首先,我得到元素。

其次,我获得项目的选票并进行计数。

第三,我想根据计票总数按顺序显示项目。

$q = $db_conn->prepare('SELECT id, title FROM thread');
$q->execute();
$q->bind_result($threadid, $title);
$q->store_result();
while($q->fetch()){

    $q2 = $db_conn->prepare('SELECT value FROM vote WHERE item_id = ? AND item_type_id = 1');
    $q2->bind_param('i', $threadid);
    $q2->execute();
    $q2->bind_result($value);
    $totvalue = 0;
    while($q2->fetch()){
        $totvalue += $value;
    }?>

    <span style='color:grey;'>[<?php echo $totvalue; ?>]</span>

    <form class='thread' method='POST'>
        <input type='image' name='vote' value='up' src='media/img/uparrow.png' />
        <input type='image' name='vote' value='down' src='media/img/downarrow.png' />
        <input type='hidden' name='threadid' value='<?php echo $threadid; ?>' />
    </form>

    <?php echo $title . "<br />";
    //DISPLAYS BY ID
}

我发现的唯一方法是将结果放入数组中并以这种方式排序。但是,当网站有数百个项目时,将整个表放入数组中是没有意义的。

$threads[] = array('threadid' => $threadid, 'title' => $title, 'totvalue' => $totvalue);

foreach ($threads as $key => $row) {
    $tid[$key]  = $row['threadid'];
    $title[$key] = $row['title'];
    $tval[$key] = $row['totvalue'];
} array_multisort($tval, SORT_DESC, $tid, SORT_DESC, $tval, SORT_DESC, $threads);

foreach ($threads as $t) { ?>

    <span style='color:grey;'>[<?php  echo $t['totvalue']; ?>]</span>

    <form class='thread' method='POST'>
        <input type='image' name='vote' value='up' src='media/img/uparrow.png' />
        <input type='image' name='vote' value='down' src='media/img/downarrow.png' />
        <input type='hidden' name='threadid' value='<?php echo $t['threadid']; ?>' />
    </form>

    <?php echo $t['title'] . "<br />";
    //DISPLAYS BY TOTAL VOTES YET THE SOLUTION IS HORRID
}

有没有办法用MySQL来做到这一点?或者还有其他最佳解决方案吗?

最佳答案

首先,您应该将查询合并为一个查询并保存查询,您应该阅读 mysql 文档/教程,因为它可以为您节省大量后端工作。

SELECT thread.id, thread.title, count(vote.value) as votes 
FROM thread JOIN vote ON thread.id = vote.item_id 
WHERE vote.item_type_id = 1
GROUP BY thread.id
ORDER BY votes DESC`

关于php - 按总票数排序结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6190971/

相关文章:

php - 使用 PHP 将 HTML+PDF 输出为 PDF

PHP:将类变量声明为 stdClass 对象

ruby-on-rails - 如何使用 ruby​​ on Rails 创建对多项选择应用程序的投票

php - 如何轻松调试跨项目共享的 symfony 包

php - 使用 PHP 从 3 个数组构建一个数组

MySql:从其他表加入并计算结果

java - 类型不匹配 : cannot convert from java. util.Date 到 java.sql.Date

php - 仅显示 10 条记录,然后单击按钮显示所有记录

php - 使用 jQuery、Ajax 和 PHP 的投票系统只能在本地服务器上运行

algorithm - 根据不同的选民人数调整选票