mysql:将子查询添加到现有查询

mysql:将子查询添加到现有查询,mysql,sql,mysql-workbench,Mysql,Sql,Mysql Workbench,我是sql新手,在实习期间,我被要求了解一点sql,因此我开始学习,并被允许在测试环境中进行练习。没有更新、插入或删除,只是显示。在练习时,我遇到了这个问题,这是我现有的查询: Select ab.USER_ID, user.email AS email, concat(user.firstName, ' ' ,user.lastName ) AS name, usl.loginDateTime AS LastLogin, ab.creation_time AS DateJoined, u

我是sql新手,在实习期间,我被要求了解一点sql,因此我开始学习,并被允许在测试环境中进行练习。没有更新、插入或删除,只是显示。在练习时,我遇到了这个问题,这是我现有的查询:

Select 
ab.USER_ID,
user.email AS email, 
concat(user.firstName, ' ' ,user.lastName ) AS name, 
usl.loginDateTime AS LastLogin,
ab.creation_time AS DateJoined,
udl.devicePlatform AS Devices,
user.status AS Status
FROM F_USR_USER AS user

INNER JOIN F_USR_ACCOUNT_BASE AS ab 
on user.ID= ab.USER_ID

INNER JOIN F_USR_DSL_LOG AS udl
ON ab.USER_ID=udl.USER_ID

INNER JOIN F_USR_SESSION_LOG AS usl
ON ab.USER_ID=usl.USER_ID
group by ab.USER_ID
我想将此select插入此查询。我尝试在内部联接中使用union all和select,但无效。可能是结构错误

这是我需要添加的查询。此查询显示每个用户的下载文档数,其中user_id作为我在此查询中使用的所有表的外键

Select ab.user_id,count(*) as total
 from F_USR_ACCOUNT_BASE AS ab ,F_USR_DOCUMENT AS doc
 where ab.USER_ID= doc.USER_ID and doc.extractionComplete = '1'
 group by ab.user_ID;

如何正确获取它?

您可以使用子查询进行连接

Select 
    ab.USER_ID,
    user.email AS email, 
    concat(user.firstName, ' ' ,user.lastName ) AS name, 
    usl.loginDateTime AS LastLogin,
    ab.creation_time AS DateJoined,
    udl.devicePlatform AS Devices,
    user.status AS Status,
    doc.total AS TotalDocs
FROM F_USR_USER AS user

INNER JOIN F_USR_ACCOUNT_BASE AS ab 
    on user.ID= ab.USER_ID

INNER JOIN F_USR_DSL_LOG AS udl
    ON ab.USER_ID=udl.USER_ID

INNER JOIN F_USR_SESSION_LOG AS usl
ON ab.USER_ID=usl.USER_ID

INNER JOIN (
    Select user_id, count(*) as total
    from F_USR_DOCUMENT
    where extractionComplete = '1'
    group by user_ID) AS doc
) ON doc.user_id = ab.user_id

group by ab.USER_ID

有几种方法可以做到这一点。一种方法是将其添加到select子句中:

Select 
ab.USER_ID,
user.email AS email, 
concat(user.firstName, ' ' ,user.lastName ) AS name, 
usl.loginDateTime AS LastLogin,
ab.creation_time AS DateJoined,
udl.devicePlatform AS Devices,
user.status AS Status,
(
    Select  count(*) as total
    from    F_USR_DOCUMENT AS doc
    where   ab.USER_ID= doc.USER_ID 
    and     doc.extractionComplete = '1'
) as totalDocs
From
F_USR_USER AS user
INNER JOIN 
F_USR_ACCOUNT_BASE AS ab on 
    user.ID= ab.USER_ID
INNER JOIN 
F_USR_DSL_LOG AS udl ON 
    ab.USER_ID=udl.USER_ID
INNER JOIN 
F_USR_SESSION_LOG AS usl ON 
    ab.USER_ID=usl.USER_ID
group by ab.USER_ID /* Maybe take this GROUP BY out.  WHERE clause to filter. */

在开始联接之前,缺少对来自的第一个查询的快速扫描。@JohnMcMahon这看起来像一个简单的复制错误,可能是在F_USR_USR作为用户之前。为什么原始查询有GROUP BY子句?它没有像MAX或COUNT这样的聚合函数。我使用group by来避免重复。您不应该将MAXusl.loginDatime用作LastLogin吗?否则它将从F_USR_SESSION_日志中随机选取一些行,这可能不是最后一次登录。设备将只是随机选择的设备,可能您希望将GROUP_CONCATDISTINCT udl.devicePlatform作为设备。我没有添加注释的权限,但我只是想对您如何使用GROUP by子句来避免重复进行注释。如果可以的话,我建议你避免这样做。在许多情况下,可以通过编辑WHERE子句来删除重复项。从我的经验来看,这使它更容易阅读,也使你的意图更容易理解。我尝试过这种方法,但对我不起作用。我得到了一个错误代码。1248 ER_派生的必须有别名,每个派生表都必须有自己的别名。我有一个别名:AS doc。我的查询中没有任何其他派生表。