Questione : sindacati complicati mySQL e sottointerrogazioni

Ancora una volta, la mia mente boggled dalla necessità di procedare “le alternative„ multiple using i sindacati. Tutta viene da una struttura di base di dati difettosa, I " m. sure, ma quella non è negoziabile a questo time.

Essentially immagina due strutture parallele all'interno dello stesso DB - per ogni tabella, ci sono inoltre versioni del arc_ (archivio) di quella tabella per le più vecchie annotazioni, ottimizzare le ricerche sulle annotazioni più correnti. Anyhoo, questo è nè qui nè là - l'edizione ora sta scrivendo a domande contro ENTRAMBI I il bisogno di sets.

I una risposta immediatamente, in modo da sto andando appena scrivere questo fuori qui, nelle speranze che appena scrivere la domanda mi dà un indizio alla risposta e, bene, se un certo genio esperto fuori là (AngelIII, sto esaminandolo!) vede questo a tempo, indennità buona! il

Oh e il _need_ di I per fare questo in una singola domanda del mySQL, anche se sono scrittura esso fuori “ai punti„ logici, il senso l'ottimizzatore devono avvicinarsi a risolvere l'annotazione set.

1. trovano tutti i messaggi in cui titolo = “ciao„ O tutti i arc_messages dove il titolo = “ciao„
2. (del sindacato) per tutto il messaggio, si unisce sul `del destinatario del `; per tutto il arc_message, unir su `che il
3. del `ottiene l'identificazione dall'annotazione arc_recipient recettiva del `del `o del `del `. Questa identificazione è una chiave straniera al `dell'allievo del `O al `arc_student del `, ma non conosciamo which.
4. using questa identificazione, non ci uniamo sul `dell'allievo del `O sul `arc_student del `e mi non diamo il name

So: il

message - > notifica - > allievo O arc_student
arc_message - > arc_notification - > allievo O arc_student

It ritiene come voglio qualcosa come:
select M.*,
di S.name
from (
seleziona message.*, notification.*
da message
unisce la notifica su message.notification_id = notification.row_id
dove message.title = 'union

del Br/>
del hello'< selezionano arc_message.*, arc_notification.*
da arc_message
unisce il arc_notification su arc_message.notification_id = arc_notification.row_id
dove arc_message.title = 'Br/> del hello'<) come M

join (
seleziona student.name
a partire da student
in cui student.row_id = M.student_id <-- il union

della colonna M.student_id

seleziona arc_student.name
a partire da arc_student
in cui arc_student.row_id = M.student.id <-- colonna sconosciuta M.student_id
) mentre S


but naturalmente m. è da portata all'interno di questo punto di join.

My è, io non vuole dovere a sinistra unire l'allievo, la parte esterna arc_student, perché allora sono lasciato con due tabelle che sto andando costantemente devo ifnull (student.name, arc_student.name) come studentName ecc…. e mentre sembra abbastanza insignificante in questo esempio semplificato, sta andando non ottenere sudicio (nel più grande) query.

Is là allineare senso fare il risultato (student_id) dalla prima sottointerrogazione (l'unione arc_message/del messaggio) nella portata per l'allievo/arc_student si unisce? il

It sarebbe semplice se ci fosse una correlazione fra il arc_message - > arc_student e messaggio - > allievo, ma purtroppo quello non è appena il case.

I potrebbe mettere l'allievo/unione arc_student come altra sottoselezione all'interno del messaggio/arc_message, ma d'altra parte dovrei farlo due volte, non? Una volta per il messaggio ed una volta per il arc_message e quello sembra appena come esso sarebbe ridondante e generare una traversa cartesiana product.

Hmmm, forse la sottoselezione interna non è un'idea difettosa….
class= > " libero " del
soluzioni >Related class= di mySQL - sindacati, sottointerrogazioni e joins

Risposta : sindacati complicati mySQL e sottointerrogazioni

Il fermo è che se un allievo (row_id) compare bene sia in allievo che arc_student MA CON IL NOME DIFFERENTE…, voi sta andando ottenere un prodotto trasversale.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
selezionare M.*, S.name
da
(
  selezionare message.*, notification.*
  dal messaggio
  unire la notifica su message.notification_id = notification.row_id
  dove message.title = “ciao„
unione
  selezionare arc_message.*, arc_notification.*
  dal arc_message
  unire il arc_notification su arc_message.notification_id = arc_notification.row_id
  dove arc_message.title = “ciao„
) come m.
unir (
  selezionare student.row_id, student.name
  dall'allievo
unione
  selezionare arc_student.row_id, arc_student.name
  da arc_student
) come S SU M.student_id = S.row_id
Altre soluzioni  
 
programming4us programming4us