2014-01-10 4 views
0

У меня есть запрос, как это,Как объединить эти два результата как один в mysql?

SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_receiver_id = b.user_id 
AND a.email_sender_id= 20 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id 
UNION 
SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_sender_id = b.user_id 
AND a.email_receiver_id= 20 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id; 

Его Ouput является -

user_id first_name last_name email_id     sharedFiles 
17  Mohan  Sharma  [email protected] 2    
17  Mohan  Sharma  [email protected] 1    

его показ двух различных записей. но я хочу вывода, как это -

user_id first_name last_name email_id     sharedFiles 
17  Mohan  Sharma  [email protected] 3 

Я новичок в MySQL, поэтому, пожалуйста, помогите мне, как получить этот вывод.

спасибо.

ответ

1
SELECT b.user_id,b.first_name, b.last_name, b.email_id, SUM(sharedFiles)as sharedFiles 
FROM(
SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_receiver_id = b.user_id 
AND a.email_sender_id= 20 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id 
UNION 
SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_sender_id = b.user_id 
AND a.email_receiver_id= 20 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id)x 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id; 
+0

сделал некоторое редактирование, и это сработало. – Aamir

1

Использование вашего запроса в качестве вспомогательного запроса позволяет дополнительно группировать и суммировать. Посмотрите на следующий запрос:

SELECT (b.user_id,b.first_name, b.last_name, b.email_id, SUM(b.sharedFiles) 
FROM (
    SELECT b.user_id,b.first_name, b.last_name, b.email_id, COUNT(DISTINCT a.file_id) AS sharedFiles 
    FROM email_history a, users b 
    WHERE a.email_receiver_id = b.user_id 
    AND a.email_sender_id= 20 
    GROUP BY b.user_id,b.first_name, b.last_name, b.email_id UNION 
    UNION 
    SELECT b.user_id,b.first_name, b.last_name, b.email_id, COUNT(DISTINCT a.file_id) AS sharedFiles 
    FROM email_history a, users b 
    WHERE a.email_sender_id = b.user_id 
    AND a.email_receiver_id= 20 
    GROUP BY b.user_id,b.first_name, b.last_name, b.email_id; 
) AS b 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id 
+1

Я уже пользуюсь союзом, пожалуйста, проверьте его еще раз. – Aamir

+0

Мой плохой, дай мне секунду, чтобы пересмотреть мой ответ –

+0

@AamirSohail делает эту работу? –

1

Общее решение для управления результатами в UNION было бы поместить его в подзапроса и не группировка во внешней функции, как это:

SELECT t.user_id, t.first_name, t.last_name, t.email_id, SUM(t.sharedFiles) 
FROM 
(SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_receiver_id = b.user_id 
AND a.email_sender_id= 20  
UNION 
SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE a.email_sender_id = b.user_id 
AND a.email_receiver_id=20) t 
GROUP BY t.user_id; 

Однако , кажется, что ваш точный запрос может быть помещен в один запрос с помощью OR.

SELECT b.user_id,b.first_name, b.last_name, b.email_id, 
COUNT(DISTINCT a.file_id) AS sharedFiles 
FROM email_history a, users b 
WHERE (a.email_receiver_id = b.user_id 
AND a.email_sender_id= 20) OR (a.email_sender_id = b.user_id 
AND a.email_receiver_id= 20) 
GROUP BY b.user_id,b.first_name, b.last_name, b.email_id 
Смежные вопросы