连接两个SELECT语句

36

有人能告诉我为什么以下代码无法正常工作吗?它会抱怨在两个select之间的join关键字附近有一个语法错误。

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_________
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

并且,使用另一个连接,我想要得到


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

也许我在这里做错了什么。有什么建议吗?

更新: 在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
) 

3
所有的加入看起来有点不必要。 - Naftali
1
你能描述一下你想从这个查询中检索什么吗?可能有更有效率的方法。 - John Kane
4个回答

85

不确定你想做什么,但是你有两个select子句。请改为这样:

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

你应该仔细检查你的答案,它正是 OP 在他的问题中发布的内容。 - maple_shaft
4
可能看起来是这样,但我在JOIN子句之后删除了SELECT * FROM - D'Arcy Rittich
1
那就解决了。抱歉我一开始的问题不太清楚,但是当我添加更多细节时,你们已经发布了答案,这个答案正好符合我的要求。 - Codrguy
你知道吗,我认为我需要一个完全连接(Full Join)来实现我的目标。如果我在你原来的解决方案中用“完全连接”代替“连接”,就会出现错误。你有什么想法来解决这个问题吗?基本上,我需要在结果集中看到所有的订单,即使一个订单只有其中一个产品。 - Codrguy
@Codrguy 这将实现你想要的功能,但是mysql不支持FULL OUTER JOIN,但是这里有一个解决方法:http://www.xaprb.com/blog/2006/05/26/how-to-write-full-outer-join-in-mysql/ - D'Arcy Rittich

12

如果您想要合并不同的结果集,可以使用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
这将实现您想要的功能:
select * 
  from orders_products 
       INNER JOIN orders 
          ON orders_products.orders_id = orders.orders_id
 where products_id in (180, 181);

-1
SELECT *
FROM
  (First_query) AS ONE
LEFT OUTER JOIN
  (Second_query ) AS TWO ON ONE.First_query_ID = TWO.Second_Query_ID;

请在您的答案中添加一个探索。 - Gregor Doroschenko
选择 * 从 (SELECT c.name AS COUNTRY_NAME
FROM STATS_TABLE ebs INNER JOIN CLASS_TABLE ebsec ON ebs.ID = ebsec.STATS_TABLE_id AND ebs.USER_ID = ebsec.user_id INNER JOIN classes ec ON ebsec.class_id = ec.id WHERE ebs.created_at blabla GROUP BY es.id) AS ea LEFT OUTER JOIN (SELECT es.School_id
FROM STATS_TABLE ebs INNER JOIN CLASS_TABLE ebsec ON ebs.ID = ebsec.STATS_TABLE_id AND USER_ID = ebsec.user_id WHERE ebs.STATUS IN ('COMPLETED') AND ebs.creted GROUP BY es.id) AS ear ON ea.School_id = ear.School_id;
- Narendra Kumar Achari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接