Pytanie : mySQL komplikować zjednoczenie i subqueries

Jeszcze raz, mój umysł boggled the potrzeba wieloskładnikowy "alternatywa" using zjednoczenie. Ono wszystkie komes od wadliwy baza danych struktura, I " m pewny, ale rejestr być do negocjacji przy ten time.

Essentially wyobrażać sobie dwa równoległy struktura wśród the ten sam DB - dla ten sam stół, tam  być także arc_ (archiwum) wersja być stół dla the stary rejestr, rewizja na the aktualny rejestr. Anyhoo, ty być neither tutaj nor tam  - the zagadnienie teraz pisać zapytanie przeciw OBA sets.

I potrzeba odpowiedź natychmiast, więc I właśnie iść być to tutaj, w the nadzieja że właśnie właśnie the pytanie dawać wskazówka the odpowiedź i, dobrze, jeżeli niektóre Biegły geniusz biegły tam  (AngelIII, I patrzeć TY!) widzieć premia w czas, to premia!

Oh, i I _need_ powinienem w pojedynczy mySQL zapytanie, nawet jeśli I być writing ono pojedynczy w logiczny "krok", the sposób the optimizer powinienem the rejestr set.

1. znajdować wszystkie wiadomość dokąd tytuł = "cześć" LUB wszystkie arc_messages dokąd tytuł = "cześć" (zrzeszeniowy)
2. dla jakaś wiadomość, łączyć na `odbiorca `; dla jakaś arc_message, łączyć na `arc_recipient `
3. dostawać the ID od the `odbierający `lub `arc_recipient `rejestr. Ten ID być cudzoziemski klucz LUB `studencki `LUB `arc_student `, ale my znać which.
4. using ten ID, łączyć na `studencki `LUB `arc_student `i dawać the name

So:

message - > powiadomienie - > uczeń LUB arc_student
arc_message - > arc_notification - > uczeń LUB arc_student

It czuć jakby I chcieć coś jak:
select M.*, S.name
from
(
wybrany message.*, notification.*
od message
łączyć powiadomienie na message.notification_id = notification.row_id
dokąd message.title = 'hello'< br/>
union

wybrany arc_message.*, arc_notification.*
od arc_message
łączyć arc_notification na arc_message.notification_id = arc_notification.row_id
dokąd arc_message.title = 'hello'< br/>) jako M

join (
wybrany student.name
od student
dokąd student.row_id = M.student_id <-- niewiadomy kolumna M.student_id

union

wybrany arc_student.name
od arc_student
dokąd arc_student.row_id = M.student.id <-- niewiadomy kolumna M.student_id
) gdy S


but oczywiście M być z zakres wśrodku ten join.

My punkt być, I chcieć z lewej strony studencki, arc_student outside, ponieważ wtedy I opuszczać z dwa stół który I ciągle iść musieć ifnull (student.name, arc_student.name) jako studentName etc…. i podczas gdy ono wydawać się dosyć trywialny w ten uproszczony przykład, ono iść upaćkany w the real (duży) query.

Is tam  szczerze żadny sposób the rezultat (student_id) od the pierwszy subquery (the wiadomość/arc_message zjednoczenie) w zakres dla the studencki/arc_student łączyć?

It być prosty jeżeli tam  być korelacja między arc_message - > arc_student i wiadomość - > uczeń, ale niestety ale być właśnie the case.

I móc the uczeń/arc_student zjednoczenie jako inny subselect wśrodku wiadomość/arc_message, ale wtedy I musieć ono dwa razy, I? Pomysł dla wiadomość i pomysł dla arc_message, i ten słuszny wydawać się jak ono być niepotrzebny i Kartezjański krzyż product.

Hmmm, być może the wewnętrzny subselect być zły pomysł….

Odpowiedź : mySQL komplikować zjednoczenie i subqueries

The chwyt być że jeżeli uczeń (row_id) pojawiać się w studencki i arc_student ALE Z RÓŻNY IMIĘ… dobrze, ty iść przecinający produkt.
(1):
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
wybrany M.*, S.name
od
(
  wybrany message.*, notification.*
  od wiadomość
  łączyć powiadomienie na message.notification_id = notification.row_id
  dokąd message.title = "cześć"
zjednoczenie
  wybrany arc_message.*, arc_notification.*
  od arc_message
  łączyć arc_notification na arc_message.notification_id = arc_notification.row_id
  dokąd arc_message.title = "cześć"
) jako M
łączyć (
  wybierać student.row_id, student.name
  od uczeń
zjednoczenie
  wybrany arc_student.row_id, arc_student.name
  od arc_student
) jako S NA M.student_id = S.row_id
Inne rozwiązania  
 
programming4us programming4us