2012-04-05 157 views
0

我有3个表格 - 用户,服务和评分。用户的主键是user_id,并且是服务表中的外键。它也是与rated_id(被评估者的用户ID)和rater_id(提供评级的人的用户ID)相关联的评级表中的外键sql按服务所有者的评分数量列出服务

每个用户具有一个服务并且可以具有多个等级。如果收视表中的推送字段为1,那么它的有效评分可以使用。如果它的0,它还没有生效,并且正在等待被推。

我需要一个查询来显示所有服务的列表,按照评级最高的用户排序的降序排列。属于评级但未推送的用户的服务与属于没有评级的用户的服务一起处于底部。

下面是创建表和数据的SQL:

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; 


/*!40101 SET @[email protected]@CHARACTER_SET_CLIENT */; 
/*!40101 SET @[email protected]@CHARACTER_SET_RESULTS */; 
/*!40101 SET @[email protected]@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 

的问题是它的不完整。用户无等级不会显示,如果用户有多个级别,但没有被压,就会出现高了......

回答

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 
+0

辉煌,完美的作品,谢谢:) – Mark 2012-04-05 17:26:41

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 

我不能百分之百肯定离开加入用户与服务。删除如果您需要用户有服务才能参与评级。

+0

伟大,感谢您的帮助。删除“左”后,它完美的作品:) – Mark 2012-04-05 17:29:22