2010-02-17 4 views
3

2 tables: propriétaires & voituresMySQL - Obtenir un résumé de plusieurs lignes groupées?

Un propriétaire peut avoir beaucoup de voitures. Une voiture peut être marquée comme usable_offroad, utilisable_onroad, ou les deux. Le tableau des voitures a des champs utilisables offroad et usable_onroad qui peut être réglé sur 0 ou 1 (non ou oui)

Consider la requête suivante:

SELECT * 
FROM owners 
LEFT JOIN cars on cars.owner_id = owners.id 
GROUP BY owners.id 
ORDER BY owners.last_name 

Mon but est de retourner une liste des propriétaires, et si ou pas chacun possède un véhicule tout-terrain ou tout-terrain, ou les deux:

Last Name First Name Has Offroad Car  Has Onroad Car 
---------------------------------------------------------------------- 
    Smith  Todd   Yes     No 
    Smith  Tom   Yes     Yes 
    Test   Sue   No     Yes 
    Thumb  Joe   No     No 
    White  Al   Yes     No 

Comment puis-je interroger ce? Pensait utiliser ROLLUP, mais préférait que le résumé ne soit pas une ligne ajoutée mais plutôt un champ réel sur la ligne propriétaire déjà groupée.

Répondre

0

Essayez ceci:

SELECT 
    T1.lastname, 
    T1.firstname, 
    T1.id in (SELECT owner_id FROM cars WHERE usable_offroad) AS `Has Offroad Car`, 
    T1.id in (SELECT owner_id FROM cars WHERE usable_onroad) AS `Has Onroad Car` 
FROM owners T1 
ORDER BY T1.lastname, T1.firstname 

Résultats:

'Smith', 'Todd', 1, 0 
'Smith', 'Tom', 1, 1 
'Test', 'Sue', 0, 1 
'Thumb', 'Joe', 0, 0 
'White', 'Al', 1, 0 

Voici mes données de test:

CREATE TABLE owners (id INT NOT NULL, firstname NVARCHAR(100) NOT NULL, lastname NVARCHAR(100) NOT NULL); 
INSERT INTO owners (id, firstname, lastname) VALUES 
(1, 'Todd', 'Smith'), 
(2, 'Tom', 'Smith'), 
(3, 'Sue', 'Test'), 
(4, 'Joe', 'Thumb'), 
(5, 'Al', 'White'); 

CREATE TABLE cars (id INT NOT NULL, owner_id INT NOT NULL, usable_onroad INT NOT NULL, usable_offroad INT NOT NULL); 
INSERT INTO cars (id, owner_id, usable_offroad, usable_onroad) VALUES 
(1, 1, 1, 0), 
(2, 2, 1, 0), 
(3, 2, 0, 1), 
(4, 3, 0, 1), 
(5, 3, 0, 1), 
(6, 5, 1, 0); 
+2

Je voudrais savoir pourquoi celui-ci a été rejetée. – k00k

+1

@ k00k: Ce n'était pas moi, mais je n'ai jamais vu la syntaxe 'id IN (SELECT ...') Mineure, mais basée sur l'OP - il n'y a pas de colonne 'is_offroad' et il n'y a pas non plus d'évaluation sur la colonne. –

+0

Clarification: 'id IN (SELECT' dans la clause SELECT.) Tel quel, cela ne retournerait pas oui ou non en fonction de la valeur –

0

L'utilisation d'un sous-requête pour résumer tous les drapeaux, puis vérifier si l'on est > 1 devrait faire le travail:

SELECT last_name, first_name, 
     CASE WHEN usable_offroad_count > 0 THEN 'Yes' ELSE 'No' END has_offroad_car, 
     CASE WHEN usable_onroad_count > 0 THEN 'Yes' ELSE 'No' END has_onroad_car 
FROM (
    SELECT owners.last_name, owners.first_name, 
      SUM(cars.usable_offroad) usable_offroad_count, 
      SUM(cars.usable_onroad) usable_onroad_count 
    FROM owners 
    LEFT JOIN cars on cars.owner_id = owners.id 
    GROUP BY owners.id 
) 
ORDER BY last_name 
0
SELECT * , 
if (cars.usable offroad = 1 and usable_onroad= 1 , 'Both' 
    , if(cars.usable offroad = 1 and usable_onroad= 0 , 'Offroad' , 'Onroad') 
    ) as Status 
FROM owners 
LEFT JOIN cars on cars.owner_id = owners.id 
GROUP BY owners.id 
ORDER BY owners.last_name 
2

Utilisation:

SELECT DISTINCT 
      o.lastname, 
      o.firstname, 
      CASE WHEN COALESCE(y.num_offroad, 0) > 0 THEN 'yes' ELSE 'no' END AS "Has Offroad Car" 
      CASE WHEN COALESCE(x.num_onroad, 0) > 0 THEN 'yes' ELSE 'no' END AS "Has Onroad Car" 
    FROM OWNERS o 
LEFT JOIN (SELECT c.owner_id, 
        COUNT(*) AS num_onroad 
      FROM CARS c 
      WHERE c.usable_onroad = 1 
     GROUP BY c.owner_id) x ON x.owner_id = o.id 
LEFT JOIN (SELECT c.owner_id, 
        COUNT(*) AS num_offroad 
      FROM CARS c 
      WHERE c.usable_offroad = 1 
     GROUP BY c.owner_id) y ON y.owner_id = o.id 
Questions connexes