2012-04-05 5 views
0

Ich habe 3 tische - benutzer, service und rating. Der Primärschlüssel des Benutzers ist Benutzer-ID und ein Fremdschlüssel in der Diensttabelle. Es ist auch ein Fremdschlüssel in der Bewertungstabelle verknüpft mit rated_id (die Benutzer-ID der Person, die bewertet wird) und rater_id (die Benutzer-ID der Person, die die Bewertung liefert)sql, um die dienstleistungen nach der anzahl der bewertungen aufzulisten die die dienstleistungsinhaber haben

Jeder Benutzer hat einen Dienst und kann verschiedene Bewertungen haben. Wenn das Push-Feld in der Bewertungstabelle 1 ist, dann ist es eine gültige Bewertung und kann verwendet werden. Wenn es 0 ist, ist es noch nicht gültig und wartet darauf, gedrückt zu werden.

Ich brauche eine Abfrage, um mir eine Liste aller Dienste anzuzeigen, sortiert in decending von den Benutzern mit den meisten Bewertungen bestellt. Dienste, die zu Benutzern gehören, die Bewertungen haben, aber nicht weitergeleitet werden, sind zusammen mit Diensten von Benutzern ohne Bewertungen unten aufgeführt.

Hier ist die SQL die Tabelle und die Daten zu erstellen:

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'); 

und hier ist eine Abfrage i mit

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 

kam das Problem seiner unvollständig ist. Benutzer ohne Bewertungen wont zeigen und wenn ein Benutzer mehrere Ratings hat aber keine geschoben werden, werden sie hoch oben ...

Antwort

0

Diese Abfrage -

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

brilliant, das funktioniert perfekt, danke :) – Mark

0

Sie könnten versuchen, diese erscheinen:

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 

Ich bin nicht hundertprozentig sicher links Benutzer mit Diensten verbinden. Entfernen Sie links, wenn Sie Benutzer benötigen, um an Bewertungen teilzunehmen.

+0

toll, vielen Dank für die Hilfe. nach dem Entfernen der "linken" funktioniert es perfekt :) – Mark

Verwandte Themen