MYSQL查询获取评论网站的平均评分值?

时间:2017-06-06 16:41:58

标签: mysql select average

这是关于评论网站的。

我试图根据整体平均评分值对项目列表进行排序。我知道有一个AVG功能,但不知道如何合并它。此外,review_category_list在我的查询中用于处理显示其他数据,并且与评级问题没有特别相关。

以下是我目前的查询,但需要以某种方式平衡每个项目的评分:

SELECT DISTINCT (
item_id
), item_name, des_location, address, city, state, zip, country, dedicated, item_desc, abv, item_type
FROM review_category_list, review_items
LEFT JOIN review ON review.review_item_id = review_items.item_id
WHERE category_id =14
AND category_id != -1
AND cat_id_cloud =14
ORDER BY review.rating DESC 
LIMIT 0 , 10

这是我的表结构:

CREATE TABLE `review_category_list` (
  `cat_id_cloud` int(11) NOT NULL AUTO_INCREMENT,
  `category` varchar(255) NOT NULL DEFAULT '',
  `catorder` tinyint(4) NOT NULL DEFAULT '0',
  `parent` varchar(255) NOT NULL DEFAULT '',
  `parent_id` int(11) NOT NULL DEFAULT '-1',
  `abv` char(2) NOT NULL,
  `olditemid` int(11) NOT NULL COMMENT 'item_id from the review_items_orig table',
  PRIMARY KEY (`cat_id_cloud`),
  UNIQUE KEY `category` (`category`,`parent_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE `review_items` (
  `item_id` int(11) NOT NULL AUTO_INCREMENT,
  `item_name` varchar(250) NOT NULL DEFAULT '',
  `item_desc` longtext NOT NULL,
  `item_type` varchar(250) NOT NULL DEFAULT '',
  `category` varchar(250) NOT NULL DEFAULT '',
  `category_id` int(11) DEFAULT '-1',
  `sortorder` tinyint(4) NOT NULL DEFAULT '0',
  `item_image` varchar(12) NOT NULL DEFAULT '',
  `item_aff_url` varchar(250) NOT NULL DEFAULT '',
  `item_aff_txt` varchar(250) NOT NULL DEFAULT '',
  `item_aff_code` varchar(250) NOT NULL DEFAULT '',
  `des_location` varchar(250) NOT NULL,
  `address` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `state` varchar(50) NOT NULL,
  `zip` varchar(20) NOT NULL,
  `country` varchar(255) NOT NULL,
  `phone` varchar(15) NOT NULL,
  `lat` float(10,6) NOT NULL DEFAULT '0.000000',
  `lon` float(10,6) NOT NULL DEFAULT '0.000000',
  `dedicated` enum('yes','no','dontknow') NOT NULL DEFAULT 'no',
  `des_contact` varchar(64) NOT NULL,
  `chapterid` int(5) NOT NULL DEFAULT '0',
  `oldcat` int(11) NOT NULL,
  PRIMARY KEY (`item_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

CREATE TABLE IF NOT EXISTS `review` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `rating` varchar(4) NOT NULL DEFAULT '',
  `summary` varchar(250) NOT NULL DEFAULT '',
  `review` longtext NOT NULL,
  `source` varchar(250) NOT NULL DEFAULT '',
  `location` varchar(250) NOT NULL DEFAULT '',
  `review_item_id` int(11) NOT NULL DEFAULT '0',
  `visitorIP` varchar(15) NOT NULL DEFAULT '0',
  `date_added` date NOT NULL DEFAULT '0000-00-00',
  `useful` int(11) NOT NULL DEFAULT '0',
  `notuseful` int(11) NOT NULL DEFAULT '0',
  `approve` enum('y','n') NOT NULL DEFAULT 'n',
  `username` varchar(50) NOT NULL DEFAULT '',
  `sig_show` enum('y','n') NOT NULL DEFAULT 'n',
  `rating2` char(3) NOT NULL DEFAULT '',
  `user_image` varchar(75) NOT NULL DEFAULT '',
  `oldid` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `id_2` (`id`),
  FULLTEXT KEY `summary` (`summary`,`review`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6443 ;

对此有任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我知道您需要一个MySQL查询,但我想每次显示列表时计算平均评分并不是达到您想要的最佳方式:根据平均评分显示项目。

相反,我要做的是实际添加' average_rating'和' number_of_reviews'字段到'项目'表

然后,在对项目进行新的审阅插入后,您只需按以下方式更新项目表:

  1. 更新' average_rating'使用公式的字段:(item.average_rating * item.number_of_reviews + review.rating)/(item.number_of_reviews + 1)(当然,如果没有评论,你需要处理角落案例,因此item.number_of_reviews为0等。 )

  2. 增加" item.number_of_reviews'字段

  3. 下次您需要获取按平均评分排序的项目列表时,您只需使用SELECT子句进行非常简单的ORDER BY查询,类似:

    SELECT * FROM item ORDER BY average_rating DESC;
    

    我认为整个方法可以更快,更可靠和可支持。