这是关于评论网站的。
我试图根据整体平均评分值对项目列表进行排序。我知道有一个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 ;
对此有任何帮助将不胜感激!
添
答案 0 :(得分:0)
我知道您需要一个MySQL查询,但我想每次显示列表时计算平均评分并不是达到您想要的最佳方式:根据平均评分显示项目。
相反,我要做的是实际添加' average_rating'和' number_of_reviews'字段到'项目'表
然后,在对项目进行新的审阅插入后,您只需按以下方式更新项目表:
更新' average_rating'使用公式的字段:(item.average_rating * item.number_of_reviews + review.rating)/(item.number_of_reviews + 1)(当然,如果没有评论,你需要处理角落案例,因此item.number_of_reviews为0等。 )
增加" item.number_of_reviews'字段
下次您需要获取按平均评分排序的项目列表时,您只需使用SELECT
子句进行非常简单的ORDER BY
查询,类似:
SELECT * FROM item ORDER BY average_rating DESC;
我认为整个方法可以更快,更可靠和可支持。