0

ユーザー、サービス、評価の3つのテーブルがあります。ユーザーの主キーはuser_idであり、サービステーブルの外部キーです。また、rated_id(評価される人のユーザーID)およびrater_id(評価を提供する人のユーザーID)にリンクされた評価テーブルの外部キー

各ユーザーには1つのサービスがあり、複数の評価を持つことができます。評価テーブルのプッシュされたフィールドが1の場合、その有効な評価であり、使用できます。0の場合、まだ有効ではなく、プッシュされるのを待っています。

すべてのサービスのリストを、最も評価の高いユーザーの降順で並べ替えて表示するためのクエリが必要です。評価はあるがプッシュされていないユーザーに属するサービスは、評価がないユーザーに属するサービスとともに下部に表示されます。

テーブルとデータを作成するためのSQLは次のとおりです。

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `ratings`
--

-- --------------------------------------------------------

--
-- Table structure for table `ratings`
--

CREATE TABLE IF NOT EXISTS `ratings` (
  `unique_id` int(11) NOT NULL AUTO_INCREMENT,
  `rater_id` int(11) NOT NULL,
  `rated_id` int(11) NOT NULL,
  `pushed` int(11) NOT NULL,
  PRIMARY KEY (`unique_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

--
-- Dumping data for table `ratings`
--

INSERT INTO `ratings` (`unique_id`, `rater_id`, `rated_id`, `pushed`) VALUES
(1, 4, 1, 1),
(2, 4, 1, 1),
(3, 4, 2, 1),
(4, 4, 3, 0);

-- --------------------------------------------------------

--
-- Table structure for table `service`
--

CREATE TABLE IF NOT EXISTS `service` (
  `unique_id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `description` varchar(100) NOT NULL,
  PRIMARY KEY (`unique_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

--
-- Dumping data for table `service`
--

INSERT INTO `service` (`unique_id`, `user_id`, `description`) VALUES
(1, 1, 'marks service'),
(2, 2, 'shanes service'),
(3, 3, 'peters service');

-- --------------------------------------------------------

--
-- Table structure for table `user`
--

CREATE TABLE IF NOT EXISTS `user` (
  `user_id` int(11) NOT NULL,
  `name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `user`
--

INSERT INTO `user` (`user_id`, `name`) VALUES
(1, 'mark'),
(2, 'shane'),
(3, 'peter'),
(4, 'jobposter');

これが私が思いついたクエリです

SELECT s.*, count(r.rated_id), r.pushed FROM service s

join user u on (u.user_id = s.user_id)
join ratings r on (r.rated_id = u.user_id)

group by r.rated_id

order by r.rated_id

問題はその不完全さです。評価のないユーザーは表示されず、ユーザーが複数の評価を持っていてもプッシュされていない場合、それらは上位に表示されます...

4

2 に答える 2

0

あなたはこれを試すかもしれません:

SELECT u.name,
       s.DESCRIPTION,
       COUNT(r.rated_id) rated,
       r.pushed
FROM   USER u
       LEFT JOIN SERVICE s
         ON ( u.user_id = s.user_id )
       LEFT JOIN ratings r
         ON ( r.rated_id = u.user_id )
GROUP  BY u.name,
          r.rated_id,
          r.pushed
ORDER  BY r.pushed DESC,
          3 DESC,
          u.name 

ユーザーをサービスに参加させたままにすることについて、100パーセント確信が持てません。評価に参加するためにユーザーにサービスを提供する必要がある場合は、を削除します。

于 2012-04-05T14:34:17.187 に答える
0

このクエリを試してください-

SELECT
  s.*, r.rated_id, r.pushed_count
FROM
  service s
JOIN user u ON
  u.user_id = s.user_id
LEFT JOIN (
    SELECT
      rated_id, COUNT(IF(pushed = 1, 1, NULL)) pushed_count
    FROM
      ratings
    GROUP BY
      rated_id
  ) r
  ON r.rated_id = u.user_id
ORDER BY
  r.pushed_count DESC
于 2012-04-05T14:42:09.980 に答える