2010-01-24 14 views
5

Tengo 4 consultas diferentes y cada una de ellas devuelve un único conjunto de resultados. Necesito combinar los resultados de la consulta con una sola consulta.Combinar múltiples resultados de consulta en MySQL (por columna)

mis consultas de ejemplo son:

1. select cls.* from (calls as cls inner join calls_users as clsusr on cls.id=clsusr.call_id) inner join users as usr on usr.id=cls.assigned_user_id where cls.assigned_user_id='seed_max_id' 

2. select mtn.* from (meetings as mtn inner join meetings_users as mtnusr on mtn.id=mtnusr.meeting_id) inner join users as usr on usr.id=mtn.assigned_user_id where mtn.assigned_user_id='seed_max_id' 

3. select tsk.* from tasks as tsk inner join users as usr on usr.id=tsk.assigned_user_id where tsk.assigned_user_id='seed_max_id' 

4. select nts.* from (notes as nts inner join accounts as acnts on acnts.id=nts.parent_id) inner join users as usr on usr.id=acnts.assigned_user_id where acnts.assigned_user_id='seed_max_id' 

me trataron de la siguiente manera, pero no funcionó

Combine: SELECT tbl1.*, tbl2.* 
from (select cls.* from (calls as cls inner join calls_users as clsusr on cls.id=clsusr.call_id) inner join users as usr on usr.id=cls.assigned_user_id where cls.assigned_user_id='seed_max_id') as tbl1 
left outer join 
(select mtn.* from (meetings as mtn inner join meetings_users as mtnusr on mtn.id=mtnusr.meeting_id) inner join users as usr on usr.id=mtn.assigned_user_id where mtn.assigned_user_id='seed_max_id') as tbl2 
using(assigned_user_id) 

también probé correcta combinación externa y otra interna se une a estoy realmente atascado , si alguien conoce la solución, por favor ayuda. Necesito el resultado similar como How can I join two tables with different number of rows in MySQL?.

Muestra

datos:

De Consulta 1:

+-------------------------------------------+------------------+- 
| Call Name         | Call Description | 
+-------------------------------------------+------------------+- 
| Discuss Review Process     | NULL    | 
| Get More information on the proposed deal | NULL    | 
| Left a message       | NULL    | 
| Discuss Review Process     | NULL    | 
+-------------------------------------------+------------------+ 

De Consulta 2:

+-----------------------+----------------------------------------------------------- 
| Meeting Name   | Meeting Description 
+-----------------------+----------------------------------------------------------- 
| Review needs   | Meeting to discuss project plan and hash out the details o 
| Initial discussion | Meeting to discuss project plan and hash out the details o 
| Demo     | Meeting to discuss project plan and hash out the details o 
| Discuss pricing  | Meeting to discuss project plan and hash out the details o 
| Review needs   | Meeting to discuss project plan and hash out the details o 
+-----------------------+----------------------------------------------------------- 

que necesito para combinar las columnas como la siguiente:

+-------------------------------------------+------------------+-------------------+-------------------+ 
| Call Name         | Call Description |Meeting Name  |Meeting Description| 
+-------------------------------------------+------------------+-------------------+-------------------+ 
| Discuss Review Process     | NULL    |Review needs  |Meeting to discuss | 
| Get More information on the proposed deal | NULL    |Initial discussion |Meeting to discuss | 
| Left a message       | NULL    |Demo    |Meeting to discuss | 
| NULL         | NULL    |Discuss pricing |Meeting to discuss | 
| NULL          | NULL    |Review needs  |Meeting to discuss | 
+-------------------------------------------+------------------+-------------------+-------------------+ 
+0

Debe describir cómo son las tablas, cómo debería ser el conjunto de resultados y cómo combinar los datos. – cletus

+0

Necesito saber, ¿hay alguna manera de hacer esto? – Imrul

Respuesta

5

Lo mejor que puedes hacer es un UNION o UNION ALL, pero esto requiere que tengan el mismo tipo y número de columnas. Por ejemplo:

SELECT 'Customer' AS type, id, name FROM customer 
UNION ALL 
SELECT 'Supplier', id, name FROM supplier 
UNION ALL 
SELECT 'Employee', id, full_name FROM employee 

Los nombres de columna no tienen que coincidir. Los alias de la primera parte se usarán para el resto.

También voy a añadir que en lugar de:

select cls.* from (calls as cls inner join calls_users as clsusr on cls.id=clsusr.call_id) inner join users as usr on usr.id=cls.assigned_user_id where cls.assigned_user_id='seed_max_id' 

debe eliminar la sub consulta innecesaria y sólo hago:

SELECT c.* 
FROM calls c 
JOIN calls_users cu ONc.id = cu.call_id 
WHERE c.assigned_user_id = 'seed_max_id' 

No hay necesidad de que la complejidad adicional y el anterior es eminentemente más legible.

+0

Esto no se puede hacer en UNION, porque necesito combinar las columnas de las consultas. – Imrul

0

Supongo que quiere que su ejemplo devuelva una sola fila combinando las entradas correspondientes de todas estas tablas. Pruebe esto y díganos si funcionó:

select * from users as usr 
left outer join (calls as cls 
    inner join calls_users as clsusr 
    on cls.id = clsusr.call_id) 
on usr.id = cls.assigned_user_id 

left outer join (meetings as mtn 
    inner join meetings_users as mtnusr 
    on mtn.id = mtnusr.meeting_id) 
on usr.id = mtn.assigned_user_id 

left outer join tasks as tsk 
on usr.id = tsk.assigned_user_id 

left outer join (notes as nts 
    inner join accounts as acnts 
    on acnts.id=nts.parent_id) 
on usr.id = acnts.assigned_user_id 

where user.id = 'seed_max_id' 
Cuestiones relacionadas