2012-04-05 28 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