2015-04-27 3 views
0

Я новичок в sql, во время моей стажировки мне требовалось знать немного sql, поэтому я начал учиться и был допущен к практике в тестовой среде (без обновления, вставки или удаления, но только отображение), во время практики я имел этот вопрос, это мой существующий запрос:mysql: добавить подзапрос к существующему запросу

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 

Я хочу, чтобы вставить этот выбор в этот query.I пытался с союзом всех и избранным в внутреннем соединении, но Бесполезная» t (возможно, структура была неправильной)

Это вопрос, который мне нужно добавить. В этом запросе отображается количество загруженных документов для каждого пользователя с User_id как th e для всех таблиц, которые я использовал в этом запросе.

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; 

Что я использую, чтобы получить его правильно?

+0

Быстрое сканирование вашего первого запроса 'FROM' отсутствует, прежде чем вы начнете JOINS. –

+0

@JohnMcMahon Это похоже на простую ошибку копирования, вероятно, перед пользователем F_USR_USR AS. – Barmar

+0

Почему в вашем исходном запросе есть предложение GROUP BY? Он не имеет никаких функций агрегации, таких как 'MAX' или' COUNT'. – Barmar

ответ

0

Существует несколько способов сделать это. Один из способов - добавить его в предложение 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. */ 
+0

У меня нет привилегий для добавления комментариев, но я просто хотел прокомментировать, как вы говорите, что используете предложение group by, чтобы избежать дублирования. Я бы рекомендовал избежать этого, если можно. Во многих случаях вы можете удалить дубликаты, отредактировав предложение WHERE. По моему опыту, это облегчает чтение, и это делает ваше намерение более понятным. – NL3294

0

Вы можете присоединиться к подзапросу.

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 
+0

Я пробовал этот метод, но он не работал для меня. Я получал код ошибки.1248 ER_DERIVED_MUST_HAVE_ALIAS: «Каждая производная таблица должна иметь свой собственный псевдоним». – sam

+0

У меня есть псевдоним: 'AS doc'. У меня нет других производных таблиц в моем запросе. – Barmar