2017-08-04 33 views
0

我在纯SQL新我想写这是查询SQL质疑倍数TABLES

select items.* 
from items 
LEFT OUTER JOIN 
    (select sum(purchase_details.quantity) as total 
    from purchase_details 
    where (purchase_details.item_id=items.id) 
GROUP BY purchase_details.item_id) ABC 

但是这给出了一个错误

You have an error in your SQL syntax; check the manual that corresponds to 
    your MariaDB server version for the right syntax to use near 'LIMIT 0, 25' 
    at line 1 

我不知道为什么它不工作

+0

您的查询没有“LIMIT”关键字(在错误消息中提及),您可以发布完整查询吗? –

+0

该错误与您的代码不符。重写你的问题,或者你的代码,或者你的错误......或者所有的东西 – nacho

+0

你没有指定你想要加入的领域是整个选择阶段?另外你只有在你的联合子查询中有总和字段?也许你需要添加Item_ID? – Learning

回答

0

此处的语法错误是您需要on条款用于您的left join。但是,根本的概念问题是不同的:你不能join从属子查询

您可以修复您的查询是这样的:

select items.* 
from items 
LEFT OUTER JOIN (
    select item_id, sum(purchase_details.quantity) as total 
    from purchase_details 
    GROUP BY purchase_details.item_id 
) ABC on ABC.item_id = items.id; 

这感动你内心的where -condition(这将取决于items.id,这是不允许的,因为它超出范围)的on -clause 。因此item_id也被添加在内部select(因为它在外面是需要的)。

一种不同的方式来写,这将是

select items.*, 
    (select sum(purchase_details.quantity) 
    from purchase_details 
    where purchase_details.item_id=items.id) as total 
from items; 

这里有一个相关子查询:内where -clause依赖于外items.id。您不再需要group by,因为where条件已经只使用该项目的行。 (而且在这种情况下,您最多也只能返回一行。)

这两个查询都是等价的,并且可以(如果优化程序发现执行计划)在内部实际上以完全相同的方式执行(这不是什么尽管如此,只要您提供适当的索引,您就必须关心很多)。

所以在你的情况下,你可以同时使用(也许检查哪一个更快);如果你想获得该物品的其他信息,你应该更喜欢left join -version,尽管如此。使用

... 
LEFT OUTER JOIN (
    select item_id, 
    sum(purchase_details.quantity) as total, 
    count(purchase_details.item_id) as cnt, 
    max(purchase_details.quantity) as max_quantity_per_order, 
    max(purchase_details.date) as latest_order, 
    ... 
    from purchase_details 
    GROUP BY purchase_details.item_id 
) ABC on ABC.item_id = items.id;