2010-01-24 4 views
5

Ich habe 4 verschiedene Abfragen und jeder von ihnen gibt einzelne eindeutige Reihe von Ergebnissen zurück. Ich muss die Abfrageergebnisse mit einer einzigen Abfrage kombinieren.Kombinieren Sie mehrere Abfrageergebnisse in MySQL (nach Spalte)

meine Beispielabfragen sind:

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' 

ich die folgende Art und Weise versucht, aber es hat nicht funktioniert

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) 

ich versuchte auch rechte äußere Verknüpfung und andere innere Joins ich wirklich stecken bin Wenn jemand die Lösung kennt dann bitte helfen. Ich brauche das ähnliche Ergebnis wie How can I join two tables with different number of rows in MySQL?.

Datenabtastblock:

Von Abfrage 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    | 
+-------------------------------------------+------------------+ 

Von Abfrage 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 
+-----------------------+----------------------------------------------------------- 

i die Spalten wie folgt kombinieren müssen:

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

Sie müssen beschreiben, wie die Tabellen aussehen, wie das Ergebnis aussehen soll und wie Sie die Daten kombinieren. – cletus

+0

Ich muss wissen, gibt es eine Möglichkeit, dies zu tun? – Imrul

Antwort

5

Das Beste, was du tun kannst, ist a UNION oder UNION ALL, aber dies erfordert, dass sie den gleichen Typ und die gleiche Anzahl von Spalten haben. Beispiel:

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 

Die Spaltennamen müssen nicht übereinstimmen. Die Aliase aus dem ersten Teil werden für den Rest verwendet.

Ich werde auch hinzufügen, dass statt:

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' 

Sie die unnötige Unterabfrage entfernen sollten und tun einfach:

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

Es gibt keine Notwendigkeit für die zusätzliche Komplexität und der oben ist eminent mehr lesbar.

+0

Dies kann nicht in UNION getan werden, weil ich Spalten der Abfragen kombinieren muss. – Imrul

0

Ich nehme an, Sie möchten, dass Ihr Beispiel eine einzelne Zeile zurückgibt und die entsprechenden Einträge aus allen diesen Tabellen kombiniert. Versuchen Sie dies und sagen Sie uns, ob es funktioniert:

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' 
Verwandte Themen