Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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
在数据库中按评级排序-将此SQL放在何处?(PHP/MySQL)_Php_Database_Database Design_Mysql - Fatal编程技术网

在数据库中按评级排序-将此SQL放在何处?(PHP/MySQL)

在数据库中按评级排序-将此SQL放在何处?(PHP/MySQL),php,database,database-design,mysql,Php,Database,Database Design,Mysql,好的-我会直截了当地说-这里是有问题的PHP代码: <h2>Highest Rated:</h2> <?php // Our query base $query = $this->db->query("SELECT * FROM code ORDER BY rating DESC"); foreach($query->result() as $row) {

好的-我会直截了当地说-这里是有问题的PHP代码:

<h2>Highest Rated:</h2>

    <?php 

        // Our query base               
        $query = $this->db->query("SELECT * FROM code ORDER BY rating DESC");

        foreach($query->result() as $row) {
    ?>  
        <h3><?php echo $row->title." ID: ";echo $row->id; ?></h3>
            <p class="author"><?php  $query2 = $this->db->query("SELECT email FROM users WHERE id = ".$row->author);
echo $query2->row('email');?></p>
            <?php   echo ($this->bbcode->Parse($row->code)); ?>

        <?php } ?>
最高评级:

对不起,有点乱,还是草稿。无论如何,我研究了使用评级系统的方法——之前我有一个“评级”字段,你可以通过按评级描述从代码顺序选择*看到。但是我很快意识到这样计算平均值是不可行的,所以我创建了五个新列——评级1、评级2、评级3、评级4、评级5。所以当5个用户给某个东西打分为4星时,评级4表示5星。。。这有意义吗?每个ratingx列统计给出评级的次数

总之,我有一个SQL语句:

SELECT id,(ifnull(评级1,0)+ifnull(评级2,0)+ifnull(评级3,0)+ifnull(评级4,0)+ifnull(评级5,0))/
((额定值1不为空)+(额定值2不为空)+(额定值3不为空)+(额定值4不为空)+(额定值5不为空))作为代码的平均值

又乱了,但是嘿。现在我需要知道的是如何将SQL语句合并到脚本中?理想情况下,您会认为整个查询将是“SELECT*FROM code ORDER BY(我刚才提到的那个很长的查询)DESC”,但我看不出它能正常工作。。。我该怎么做?查询,将结果存储在变量中,诸如此类

如果没有道理的话,对不起!但我真的很感谢你的帮助:)


杰克

你应该完全回到绘图板上

<?php
$query = $this->db->query("SELECT * FROM code ORDER BY rating DESC");
foreach($query->result() as $row) {
    $this->db->query("SELECT email FROM users WHERE id = ".$row->author;
}
此查询将捕获单个resultset中的所有数据,从而消除N+1查询问题


在你澄清你的问题并澄清你想做什么之前,我不会回答你问题的其余部分。

首先,我决定你的应用程序是重写还是重读。如果读操作比写操作多得多,那么您需要最小化在读操作上所做的工作(例如,像这个脚本)。假设它的阅读量很大,因为大多数网络应用程序都是如此,我建议在单独的一列中保留合并平均值,并在用户添加新评分时重新计算

其他选择包括:

  • 尝试按计算列名称“average”排序。SQL Server支持此。我不确定mysql
  • 使用视图。您可以在基础表上创建一个视图,该视图为您进行平均值计算,并且您可以对其进行查询

另外,与您的问题无关,不要对循环中的每个用户进行单独的查询。将用户表加入原始查询中的代码表。

如果您想再次更改表,我的建议如下:

为什么不存储两列:RatingTotal和RatingCount,每个对其进行评分的用户将RatingCount增加1,并且他们投票的任何内容(5、4、4.2等)都将添加到RatingTotal中。然后,您可以通过评级Total/RatingCount进行订购


另外,我希望您存储哪些用户对每个项目进行了评分,这样他们就不会多次投票了!然后按他们的方式摆动平均值。

您应该将其包括在选择部分:

SELECT *, (if ....) AS average FROM ... ORDER BY average
编辑:假设您的ifnull语句实际有效

您可能还希望查看联接,以避免为每个用户再次查询数据库;您可以在一条select语句中完成所有操作


除此之外,我还想说,你只需要一个平均值和总投票数,这应该会给你提供你所需要的所有信息。

一些非常好的想法,但我认为最好的方法(正如sidereal所说,读重于写重)是对专栏进行评级和对时间进行评级,然后像这样做:

new_rating = ((times_rated * rating) + current_rating) / (times_rated + 1)

当前_评级是指当用户单击小星星时应用的评级。这只是将当前用户的平均评分与当前评分进行加权。

Jack,您的长查询确实有效吗?请更新您的问题以显示
show CREATE TABLE code\G
的输出。此外,多栏评级几乎肯定是个坏主意。谢谢大家的帮助,我希望你们能理解我是一个初学者!我知道SQL联接,但不一定在这里使用它们,将来也会使用。我刚刚又读了一遍我写的东西。。。抱歉,我整个晚上都在编码,头脑太麻木了,无法理解我会重新思考我的代码,如果我仍然需要帮助,重新发布。谢谢:)@jeroen,如果全世界都是无所不知的,那么就有足够的分数来投票。是的,我在-1上看到了他们所有人-我真的很感激他们的建议,并把他们都投了赞成票,尽管我不确定是谁做的(我还没有足够的分数来投票反对…)我也只是重复PHP中的
H3
之类的简单内容,而不是一直在html和PHP之间跳转,因为这些琐碎的事情为什么会被否决?这对我来说是个明智的建议?!谢谢你的建议!我还在学习,但谢谢你们,我真的很感激:)我想我们都必须从某个地方开始:潘德·罗兰,所有人似乎都被否决了。我把所有东西都投回0,我同意你的观点…谢谢-肯定会读得很重。感谢您的帮助-您可以告诉我,我还在学习:)谢谢,了解我,我会忘记检查哪些用户已经投票;)创建一个评分表,其中包含用户、项目、评分和日期。您可以使用它来计算平均评级,但是将聚合存储在项目中可以简化和加快其他查询。
new_rating = ((times_rated * rating) + current_rating) / (times_rated + 1)