2012-10-05 1 views
1

Étant donné les tableaux:globale sur plusieurs conditions: se convertir à une seule requête

reservations (id, place_id, confirmed_at, paid_at) et places (id, name)

Je dois retourner l'ensemble qui peut être exprimé les requêtes suivantes séparément:

-- Confirmed 
SELECT places.id, places.name, COUNT(reservations.*) as total_confirmed 
FROM reservations 
    INNER JOIN places ON places.id = reservations.place_id 
WHERE 
    reservations.confirmed_at IS NOT NULL 
GROUP BY places.id, places.name 

-- Paid 
SELECT places.id, places.name, COUNT(reservations.*) as total_paid 
FROM reservations 
    INNER JOIN places ON places.id = reservations.place_id 
WHERE 
    reservations.paid_at IS NOT NULL 
GROUP BY places.id, places.name 

-- Paid Uncofirmed 
SELECT places.id, places.name, COUNT(reservations.*) as total_paid_unconfirmed 
FROM reservations 
    INNER JOIN places ON places.id = reservations.place_id 
WHERE 
    reservations.paid_at IS NOT NULL AND reservations.confirmed_at IS NULL 
GROUP BY places.id, places.name 

Comment puis-je réécrire ces requêtes dans un seul et retourner tout le nécessaire?

Répondre

1

Je préfère avoir une requête comme ça, parce que s'il y a des places qui ont pas encore reservation ou peut avoir plusieurs réserves déjà. Pourtant, il est prudent de calculer le SUM.

SELECT d.*, a.total_confirmed, b.total_paid, c.total_paid_unconfirmed 
FROM places d 
     LEFT JOIN 
     (
      SELECT places.id, places.name, COUNT(reservations.*) as total_confirmed 
      FROM reservations 
       INNER JOIN places ON places.id = reservations.place_id 
      WHERE 
       reservations.confirmed_at IS NOT NULL 
      GROUP BY places.id, places.name 
     ) a ON d.id = a.id 
     LEFT JOIN 
     (
      SELECT places.id, places.name, COUNT(reservations.*) as total_paid 
      FROM reservations 
       INNER JOIN places ON places.id = reservations.place_id 
      WHERE 
       reservations.paid_at IS NOT NULL 
      GROUP BY places.id, places.name 
     ) b ON d.id = b.id 
     LEFT JOIN 
     (
      SELECT places.id, places.name, COUNT(reservations.*) as total_paid_unconfirmed 
      FROM reservations 
       INNER JOIN places ON places.id = reservations.place_id 
      WHERE 
       reservations.paid_at IS NOT NULL AND reservations.confirmed_at IS NULL 
      GROUP BY places.id, places.name 
     ) c ON d.id = c.id 
3
SELECT places.id, places.name, 
sum(case when (reservations.confirmed_at IS NOT NULL) then 1 else 0 end) as total_confirmed, 
sum(case when (reservations.paid_at IS NOT NULL) then 1 else 0 end) as total_paid, 
sum(case when (reservations.paid_at IS NOT NULL AND reservations.confirmed_at IS NULL) then 1 else 0 end) as total_confirmed_paid 
FROM reservations 
    INNER JOIN places ON places.id = reservations.place_id 
GROUP BY places.id, places.name 
+0

Je soupçonne que votre requête a quelques fautes de frappe, vous avez trois colonnes appelé « total_confirmed » – DaveRlz

+0

s'il y a des endroits qui ne disposent pas de réservation ou peut avoir plusieurs réservation? cela affectera le 'SUM'. –

+0

pouvez-vous le vérifier .. – jainvikram444

1

ces requêtes peuvent être combinées ensemble à l'aide de l'Union, mais dans l'union, toutes les requêtes doivent retourner même jeu de résultats, pour que la sortie de toutes les requêtes doivent être identiques. Cela peut se faire comme suit:

SELECT places.id, places.name,'total_confirmed' as totalType, COUNT(reservations.*) as total 
FROM reservations INNER JOIN places ON places.id = reservations.place_id 
WHERE reservations.confirmed_at IS NOT NULL 
GROUP BY places.id, places.name 
union all 
SELECT places.id, places.name,'total_paid' as totalType, COUNT(reservations.*) as total 
FROM reservations INNER JOIN places ON places.id = reservations.place_id 
WHERE reservations.paid_at IS NOT NULL 
GROUP BY places.id, places.name 
union all 
SELECT places.id, places.name,'total_paid_unconfirmed' as totalType, COUNT(reservations.*) as total 
FROM reservations INNER JOIN places ON places.id = reservations.place_id 
WHERE reservations.paid_at IS NOT NULL AND reservations.confirmed_at IS NULL 
GROUP BY places.id, places.name 
Questions connexes