объединение двух утверждений - PullRequest
14 голосов
/ 17 мая 2011

Может кто-нибудь сказать мне, почему следующее не будет работать? Он жалуется на синтаксическую ошибку рядом с ключевым словом соединения между двумя вариантами выбора.

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

По сути, мой первый SELECT извлекает всю информацию о заказе для определенного продукта из одной таблицы, вытягивает заказанное количество из другого и объединяет их вместе. Второй SELECT делает то же самое для другого продукта.

Теперь у меня есть

_______A_________         _______B_________<br>
O_ID   P_ID   Q            O_ID   P_ID   Q <br>
1       180   3            1       181   11<br>
2       180   9            2       181   6<br>
3       180   5            3       181   3<br>

И, используя другое объединение, я хочу получить

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

Может быть, я ошибаюсь здесь. Есть предложения?

UPDATE: Вот что сработало для меня после указателей 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
) 

Ответы [ 4 ]

43 голосов
/ 17 мая 2011

Не уверен, что вы пытаетесь сделать, но у вас есть два предложения выбора. Сделайте это вместо:

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

Обновление:

Возможно, вы могли бы уменьшить его до чего-то вроде этого:

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
8 голосов
/ 17 мая 2011

Вы должны использовать UNION , если хотите объединить разные наборы результатов. Попробуйте следующее:

(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)
3 голосов
/ 17 мая 2011

Это будет делать то, что вы хотите:

select * 
  from orders_products 
       INNER JOIN orders 
          ON orders_products.orders_id = orders.orders_id
 where products_id in (180, 181);
0 голосов
/ 12 апреля 2018
SELECT *
FROM
  (First_query) AS ONE
LEFT OUTER JOIN
  (Second_query ) AS TWO ON ONE.First_query_ID = TWO.Second_Query_ID;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...