Question : syndicats compliqués par mySQL et sous-questions

De nouveau, mon esprit est rechigné par la nécessité de traiter des « solutions de rechange » multiples using des syndicats. Il tout vient d'une structure de base de données défectueuse, I " m sure, mais ce n'est pas négociable à ce time.

Essentially imaginent deux structures parallèles dans le même DB - pour chaque table, il y a également des versions d'arc_ (archives) de cela table pour les disques plus anciens, pour optimiser des recherches sur les articles plus courants. Anyhoo, ceci n'est ni ici ni là - l'issue écrit maintenant à des questions contre LES DEUX le besoin de sets.

I une réponse immédiatement, ainsi je vais juste écrire ceci dehors ici, dans les espoirs que juste la rédaction de la question me donne un indice à la réponse et, bien, si un certain génie expert dehors là (AngelIII, je vous regarde !) voit ceci à temps, bonification bonne ! le

Oh, et le _need_ d'I pour faire ceci dans une question simple de mySQL, quoique je sois écriture il dehors dans des « étapes » logiques, la manière l'optimiseur doivent approcher résoudre le disque set.

1. trouvent tous les messages où titre = « bonjour » OU tous les arc_messages où le titre = « bonjour » le
2. (des syndicats) pour n'importe quel message, se joignent sur le `de destinataire de `; pour n'importe quel arc_message, joindre sur le `le
3. de `obtiennent l'identification du disque arc_recipient réceptif de `de `ou de `de `. Cette identification est une clef étrangère au `d'étudiant de `OU au `arc_student de `, mais nous ne savons pas which.
4. using cette identification, ne nous joignons pas sur le `d'étudiant de `OU le `arc_student de `et ne me donnons pas le name

So : le

message - > avis - > étudiant OU arc_student
arc_message - > arc_notification - > étudiant OU arc_student

It se sent comme je veux quelque chose comme :
select M.*,
de S.name
from (le
choisissent message.*, notification.*
du message
joignent l'avis sur message.notification_id = notification.row_id
où message.title = 'l'union

du Br/>
de hello'< choisissent arc_message.*, arc_notification.*
de l'arc_message
joignent l'arc_notification sur arc_message.notification_id = arc_notification.row_id
où arc_message.title = 'le Br/> de hello'<) comme M

join (le
choisissent student.name
à partir du student
où student.row_id = M.student_id <-- l'union

de la colonne M.student_id

choisissent arc_student.name
à partir de l'arc_student
où arc_student.row_id = M.student.id <-- colonne inconnue M.student_id
) pendant que S


but naturellement M est hors de portée à l'intérieur de ce point de join.

My est, je ne veulent pas devoir à gauche joindre l'étudiant, l'extérieur arc_student, parce qu'alors je suis laissé avec deux tables que je vais constamment dois l'ifnull (student.name, arc_student.name) comme studentName etc.…. et est-ce que tandis qu'il semble assez insignifiant dans cet exemple simplifié, il va-t-il n'obtenir malpropre dans le vrai (plus grand) query.

Is là vraiment aucune manière de faire le résultat (student_id) à partir de la première sous-question (l'union de message/arc_message) dans la place pour l'étudiant/arc_student se joignent ? le

It serait simple s'il y avait une corrélation entre l'arc_message - > arc_student et message - > étudiant, est-ce que mais malheureusement ce n'est pas juste le case.

I pourrait mettre l'étudiant/union arc_student en tant qu'autre subselect à l'intérieur de message/d'arc_message, mais d'autre part je devrais le faire deux fois, pas je ? Une fois pour le message et une fois pour l'arc_message, et celui semble juste comme lui serait superflu et produire d'une croix cartésienne product.

Hmmm, peut-être le subselect intérieur n'est pas une mauvaise idée….
class= > " clair " de
solutions >Related class= de mySQL - syndicats, sous-questions et joins

Réponse : syndicats compliqués par mySQL et sous-questions

Le crochet est que si un étudiant (row_id) apparaît dans l'étudiant et arc_student MAIS AVEC LE NOM DIFFÉRENT… bien, vous vont obtenir un produit en travers.
1 :
2 :
3 :
4 :
5 :
6 :
7 :
8 :
9 :
10 :
11 :
12 :
13 :
14 :
15 :
16 :
17 :
18 :
19 :
20 :
choisir M.*, S.name
de
(
  choisir message.*, notification.*
  du message
  joindre l'avis sur message.notification_id = notification.row_id
  là où message.title = « bonjour »
union
  choisir arc_message.*, arc_notification.*
  de l'arc_message
  joindre l'arc_notification sur arc_message.notification_id = arc_notification.row_id
  là où arc_message.title = « bonjour »
) comme M
joindre (
  choisir student.row_id, student.name
  de l'étudiant
union
  choisir arc_student.row_id, arc_student.name
  d'arc_student
) comme S SUR M.student_id = S.row_id
Autres solutions  
  •  MS Excel 2007 et pdf - l'exportation vers le pdf prend de longues heures !
  •  Dans le Perl, comment j'ajoute une valeur à la liste, puis le contrôle pour voir si la valeur existent avant d'ajouter une nouvelle valeur
  •  Comment fais j'initialiser de la HP BL460c G6 de san et de la HP XP 240000
  •  Comment fais j'employer une clef de permis de volume sur un ordinateur de HP avec du CD de restauration
  •  Emplacement primaire de deux SCCM dans l'annuaire actif
  •  L'initiateur et la HP D2D de l'iSCSI R2 du serveur 2008 de Windows GERCENT l'issue
  •  Stocker le dossier dans le mysql using connector.net et le champ de goutte
  •  Carte vidéo d'USB - bit 32 sur le matériel travaillant au niveau du bit 64 ?
  •  asp.net que j'essaye de convertir une forme de HTML en forme d'aspx ou ? ce qui jamais. Aide du besoin sur la façon dont à à elle.
  •  Winzip 12 issues de secours du travail ?
  •  
    programming4us programming4us