Cuestión : uniones complicadas mySQL y subconsultas

De nuevo, mi mente boggled por la necesidad de procesar “alternativas múltiples” usar uniones. Toda viene de una estructura de base de datos culpable, I " m sure, pero eso no es negociable en este time.

Essentially se imagina dos estructuras paralelas dentro del mismo DB - para cada tabla, hay también versiones del arc_ (archivo) de eso tabla para los más viejos expedientes, optimizar búsquedas en los registros en curso. Anyhoo, éste está ni aquí ni allí - la edición ahora está escribiendo a preguntas contra AMBOS necesidad de sets.

I una respuesta inmediatamente, así que apenas voy a escribir esto aquí, con la esperanza de que apenas poner la pregunta en escrito me dé una pista a la respuesta y, bien, si un cierto genio experto hacia fuera allí (AngelIII, le estoy mirando!) ¡ve esto a tiempo, prima bien! el

Oh, y el _need_ de I para hacer esto en una sola pregunta del mySQL, aunque soy escritura él hacia fuera en “pasos lógicos”, la manera el optimizador deben acercarse a solucionar el expediente set.

1. encuentran todos los mensajes donde título = “hola” O todos los arc_messages donde el título = “hola” el
2. (de la unión) para cualquier mensaje, ensambla en `del recipiente del `; para cualquier arc_message, ensamblar en `que el
3. del `consigue la identificación del expediente arc_recipient receptor del `del `o del `del `. Esta identificación es una llave extranjera al `del estudiante del `O al `arc_student del `, pero no sabemos which.
4. usar esta identificación, no ensamblamos en `del estudiante del `O `arc_student del `y no me damos el name

So: el

message - > notificación - > estudiante O el arc_student
arc_message - > arc_notification - > estudiante O el arc_student

It siente como quiero algo como:
select M.*,
de S.name
from (el
selecciona message.*, notification.*
del message
ensambla la notificación en message.notification_id = notification.row_id
donde message.title = 'el union

del Br/>
del hello'< seleccionan arc_message.*, arc_notification.*
del arc_message
ensambla el arc_notification en arc_message.notification_id = arc_notification.row_id
donde arc_message.title = 'el Br/> del hello'<) como M

join (el
selecciona student.name
del student
donde student.row_id = M.student_id <-- el union

de la columna M.student_id

selecciona arc_student.name
del arc_student
donde arc_student.row_id = M.student.id <-- columna desconocida M.student_id
) mientras que es S


but por supuesto M está fuera de alcance dentro de este punto de join.

My, yo no quiere tener que a la izquierda ensamblar el estudiante, el exterior arc_student, porque entonces me dejan con dos tablas a que vaya constantemente tuve que el ifnull (student.name, arc_student.name) como studentName los etc…. ¿y mientras que parece bastante trivial en este ejemplo simplificado, va a no conseguir sucio en el query.

Is allí verdad ninguna manera de hacer el resultado (student_id) de la primera subconsulta (la unión del mensaje/del arc_message) en el alcance para el estudiante/arc_student ensambla? ¿el

It sería simple si hubiera una correlación entre el arc_message - > arc_student y mensaje - > estudiante, pero desafortunadamente ése no es apenas el case.

I podría poner el estudiante/la unión arc_student como otro subselect dentro del mensaje/del arc_message, pero por otra parte tendría que hacerlo dos veces, no? Una vez para el mensaje y una vez para el arc_message, y ése apenas parece como él sería redundante y generar una cruz cartesiana product.

Hmmm, el subselect interno no es quizá una mala idea….
class= > " claro " del
soluciones >Related class= del mySQL - uniones, subconsultas y joins

Respuesta : uniones complicadas mySQL y subconsultas

El retén es que si un estudiante (row_id) aparece en estudiante y arc_student PERO CON DIVERSO NOMBRE… bien, usted va a conseguir un producto cruzado.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
seleccionar M.*, S.name
de
(
  seleccionar message.*, notification.*
  de mensaje
  ensamblar la notificación en message.notification_id = notification.row_id
  donde message.title = “hola”
unión
  seleccionar arc_message.*, arc_notification.*
  de arc_message
  ensamblar el arc_notification en arc_message.notification_id = arc_notification.row_id
  donde arc_message.title = “hola”
) como M
ensamblar (
  seleccionar student.row_id, student.name
  de estudiante
unión
  seleccionar arc_student.row_id, arc_student.name
  de arc_student
) como S EN M.student_id = S.row_id
Otras soluciones  
 
programming4us programming4us