web-dev-qa-db-fra.com

joindre deux déclarations sélectionnées

Quelqu'un peut-il me dire pourquoi les éléments suivants ne fonctionnent pas? Il se plaint d'une erreur de syntaxe près de la clé de jointure Word entre les deux sélections.

SELECT * 
FROM ( select * from orders_products inner JOIN orders ON orders_products.orders_id = orders.orders_id  where products_id = 181) 
as A

join 

SELECT * 
FROM ( select * from orders_products INNER JOIN orders ON orders_products.orders_id = orders.orders_id  where products_id = 180) 
as B

on A.orders_id=B.orders_id

Fondamentalement, mon premier SELECT tire toutes les informations de commande pour un certain produit d'une table et tire la quantité commandée d'une autre et les joint ensemble. Le second SELECT fait la même chose pour un autre produit.

Maintenant j'ai

_______UN B_________
O_ID P_ID Q O_ID P_ID Q 
1 180 3 1 181 11
2 180 9 2 181 6
3 180 5 3 181 3

Et, en utilisant une autre jointure, je veux obtenir


Q_ID P_ID1 Q1 P_ID2 Q2
1 180 3 181 11
2 180 9 181 6
3 180 5 181 3

Peut-être que je prends une mauvaise approche ici. Aucune suggestion?

MISE À JOUR: Voici ce qui a fonctionné pour moi après les pointeurs de RedFilter:

(SELECT * 
FROM (
SELECT * FROM orders_products
INNER JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE products_id =181) AS A
LEFT JOIN (
SELECT * FROM orders_products
INNER JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE products_id =180) AS B ON A.orders_id = B.orders_id
)
UNION (
SELECT * 
FROM (
SELECT * 
FROM orders_products
INNER JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE products_id =181
) AS C
RIGHT JOIN (
SELECT * 
FROM orders_products
INNER JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE products_id =180
) AS D ON C.orders_id = D.orders_id
) 
15
Codrguy

Vous ne savez pas ce que vous essayez de faire, mais vous avez deux clauses de sélection. Faites ceci à la place:

SELECT * 
FROM ( SELECT * 
       FROM orders_products 
       INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
       WHERE products_id = 181) AS A
JOIN ( SELECT * 
       FROM orders_products 
       INNER JOIN orders ON orders_products.orders_id = orders.orders_id
       WHERE products_id = 180) AS B

ON A.orders_id=B.orders_id

Mise à jour:

Vous pourriez probablement le réduire à quelque chose comme ceci:

SELECT o.orders_id, 
       op1.products_id, 
       op1.quantity, 
       op2.products_id, 
       op2.quantity
FROM orders o
INNER JOIN orders_products op1 on o.orders_id = op1.orders_id  
INNER JOIN orders_products op2 on o.orders_id = op2.orders_id  
WHERE op1.products_id = 180
AND op2.products_id = 181
45
RedFilter

Vous devez utiliser UNION si vous souhaitez combiner différents jeux de résultats. Essayez ce qui suit:

(SELECT * 
 FROM ( SELECT * 
        FROM orders_products 
        INNER JOIN orders ON orders_products.orders_id = orders.orders_id  
        WHERE products_id = 181) AS A)
UNION 

(SELECT * 
 FROM ( SELECT * 
        FROM orders_products 
        INNER JOIN orders ON orders_products.orders_id = orders.orders_id 
        WHERE products_id = 180) AS B
ON A.orders_id=B.orders_id)
8
alexn

Cela fera ce que vous voulez:

select * 
  from orders_products 
       INNER JOIN orders 
          ON orders_products.orders_id = orders.orders_id
 where products_id in (180, 181);
3
maple_shaft