2017-06-06 13 views
0

これはレビューウェブサイトに関するものです。レビューサイトの平均評価値を取得するMYSQLクエリ?

私は全体的な平均評価値に基づいてアイテムのリストをソートしようとしています。私は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 ; 

この上の任意のに役立つだろう大変感謝しています!

ティム

+2

テストデータも提供すれば、これはほぼ完璧な質問 – RiggsFolly

+0

となります。希望の結果を提供しても本当に完璧な質問になります。 – Strawberry

+0

DISTINCTは関数ではないことに注意してください。しかし、おそらくあなたはそれをすでに考え出しました。 – Strawberry

答えて

0

は、私はあなたがMySQLのクエリが必要であることを理解し、私はあなたがリストを表示平均評価を計算するたびにあなたが望むものを達成するための最良の方法ではないと仮定します。それらの平均評価に基づいて項目を示します。

代わりに、私は実際に 'average_rating'と 'number_of_reviews'フィールドを 'item'テーブルに追加します。

  1. 更新式を使用して「AVERAGE_RATING」フィールド:(*アイテムをitem.average_rating

    次に、項目の新しいレビューを挿入すると、あなただけのアイテムテーブルに、次のように更新することができます。 (レビューの件数が0であるなど、レビューがない場合はもちろんコーナーケースを処理する必要があります)

  2. 「item.number_of_reviews」を増やしてください'フィールド

SELECT * FROM item ORDER BY average_rating DESC; 

私はこの全体のアプローチは、はるかに高速に動作すると思います:あなたは平均的な評価で注文した商品の一覧を取得する必要があり

次回は、あなただけのORDER BY句、そのようなもので、非常に簡単なSELECTクエリを実行しますより信頼性とサポート可能。

関連する問題