2010-08-10 2 views
1

Existe-t-il un moyen de renvoyer des valeurs distinctes avec des données vides/nulles d'une jointure de table? Meilleur à expliquer avec mon exemple ci-dessous.Renvoie des enregistrements distincts et nuls d'une requête de jointure mysql

Tableau "ordres"

order_id | order_total 
1  | 10 
2  | 20 
3  | 50 

Table "ordre_items"

item_id | order_id | name  | qty_ordered | base_price | row_total 
1  | 1  | Product | 1   | 10   | 10 
2  | 2  | Product | 1   | 10   | 10 
3  | 2  | Product2 | 1   | 10   | 10 
4  | 3  | Product | 2   | 10   | 20 
5  | 3  | Product2 | 3   | 10   | 30 

Je suis en train de produire un jeu de résultats qui ressemble à ceci.

order_id | item_id | name  | qty_ordered | base_price | row_total | order_total 
1  | 1  | Product | 1   | 10   | 10  | 10 
2  | 2  | Product | 1   | 10   | 10  | 20 
null  | 3  | Product2 | 1   | 10   | 10  | null 
3  | 4  | Product | 2   | 10   | 20  | 50 
null  | 5  | Product2 | 3   | 10   | 30  | null 

Je veux seulement le order_id et le order_total une fois par commande. Je pense que c'est possible avec une sorte de requête join/distinct/sub mais hélas, rien de ce que j'ai essayé n'a fonctionné jusqu'à présent.

Répondre

1

Utilisation:

SELECT x.order_id, 
     x.item_id, 
     x.name, 
     x.qty_ordered, 
     x.base_price, 
     x.row_total, 
     x.order_total 
    FROM (SELECT CASE 
        WHEN @order = o.order_id THEN NULL 
        ELSE o.order_id 
       END AS order_id, 
       oi.item_id, 
       oi.name, 
       oi.qty_ordered, 
       oi.base_price, 
       oi.row_total, 
       o.order_total, 
       CASE 
        WHEN @order = o.order_id THEN NULL 
        ELSE o.order_total 
       END AS order_total, 
       @order := o.order_id 
      FROM ORDER_ITEMS oi 
      JOIN ORDERS o ON o.order_id = oi.order_id 
      JOIN (SELECT @order := -1) r 
     ORDER BY o.order_id, oi.item_id) x 
+0

Vous faites toujours votre look SQL si beau, je veux que tu rond pour ranger mon code. –

+0

Wow! C'est incroyable. Et oui, si élégamment présenté ce genre de look simple maintenant. Genre de. Merci beaucoup. – Bobby

0
SELECT * FROM order_items 
LEFT JOIN orders 
ON (
    order_items.order_id=orders.order_id 
AND 
    order_items.item_id=(
     SELECT MIN(item_id) 
     FROM order_items a 
     WHERE a.order_id=order_items.order_id 
    ) 
) 

Cela devrait fonctionner parce que la requête imbriquée renvoie toujours le même MIN (item_id) pour chaque commande, et il se joint uniquement pour cet élément.

Mais c'est un très, très moche morceau de sql. Ne fais pas ça.

Questions connexes