Pergunta : uniões complicadas mySQL e subqueries

Mais uma vez, minha mente boggled pela necessidade de processar “alternativas múltiplas” using uniões. Toda vem de uma estrutura de base de dados defeituosa, I " m sure, mas aquela não é negociável neste time.

Essentially imagina duas estruturas paralelas dentro do mesmo DB - para cada tabela, há igualmente umas versões do arc_ (arquivo) daquela tabela para os registros mais velhos, para aperfeiçoar buscas nos registros mais atuais. Anyhoo, este está nem aqui nem lá - a edição está escrevendo agora a perguntas de encontro AMBOS OS à necessidade de sets.

I uma resposta imediatamente, assim que eu apenas estou indo escrever para fora este aqui, nas esperanças que apenas escrever para fora a pergunta me dá um indício à resposta e, bem, se algum gênio perito para fora lá (AngelIII, eu o estou olhando!) vê isto a tempo, bônus bom! o

Oh, e o _need_ de I para fazer isto em uma única pergunta do mySQL, mesmo que eu seja escrita ele para fora em “etapas lógicas”, a maneira o optimizer devem aproximar a resolução do registro set.

1. encontram todas as mensagens onde título = “olá!” OU todos os arc_messages onde o título = “olá!” o
2. (da união) para toda a mensagem, se junta no `do receptor do `; para todo o arc_message, juntar-se no `que o
3. do `começ a identificação do registro arc_recipient destinatário do `do `ou do `do `. Esta identificação é uma chave extrangeira ao `do estudante do `OU ao `arc_student do `, mas nós não sabemos which.
4. using esta identificação, não nos juntamos no `do estudante do `OU no `arc_student do `e não nos damos me o name

So: o

message - > notificação - > estudante OU arc_student
arc_message - > arc_notification - > estudante OU arc_student

It sente como eu quero algo como:
select M.*,
de S.name
from (o
seleciona message.*, notification.*
do message
se junta à notificação em message.notification_id = notification.row_id
onde message.title = 'o union

do Br/>
do hello'< selecionam arc_message.*, arc_notification.*
do arc_message
se junta ao arc_notification em arc_message.notification_id = arc_notification.row_id
onde arc_message.title = 'o Br/> do hello'<) como M

join (o
seleciona student.name
do student
onde student.row_id = M.student_id <-- o union

da coluna M.student_id

seleciona arc_student.name
do arc_student
onde arc_student.row_id = M.student.id <-- coluna desconhecida M.student_id
) enquanto S


but naturalmente M é fora do espaço dentro deste ponto de join.

My é, mim não quer ter que à esquerda se juntar ao estudante, à parte externa arc_student, porque eu estou deixado então com as duas tabelas que eu estou indo constantemente tenho que o ifnull (student.name, arc_student.name) como o studentName etc.…. e quando parecer consideravelmente trivial neste exemplo simplificado, está indo não começ desarrumado no query.

Is lá verdadeiramente nenhuma maneira de fazer o resultado (student_id) do primeiro subquery (a união da mensagem/arc_message) no espaço para o estudante/arc_student junta-se? o

It seria simples se havia uma correlação entre o arc_message - > arc_student e mensagem - > estudante, mas infelizmente aquele não é apenas o case.

I poderia põr o estudante/união arc_student como um outro subselect dentro da mensagem/arc_message, mas por outro lado eu teria que fazê-lo duas vezes, não eu? Uma vez para a mensagem e uma vez para o arc_message, e a aquela apenas parece como ele seria redundante e para gerar uma cruz cartesiana product.

Hmmm, talvez o subselect interno não é uma idéia má….
class= > " desobstruído " do
soluções >Related class= do mySQL - uniões, subqueries e joins

Resposta : uniões complicadas mySQL e subqueries

O prendedor é que se um estudante (row_id) aparece no estudante e arc_student MAS COM NOME DIFERENTE… bem, você está indo começ um produto transversal.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
selecionar M.*, S.name
de
(
  selecionar message.*, notification.*
  da mensagem
  juntar-se à notificação em message.notification_id = notification.row_id
  onde message.title = “olá!”
união
  selecionar arc_message.*, arc_notification.*
  do arc_message
  juntar-se ao arc_notification em arc_message.notification_id = arc_notification.row_id
  onde arc_message.title = “olá!”
) como M
juntar-se (
  selecionar student.row_id, student.name
  do estudante
união
  selecionar arc_student.row_id, arc_student.name
  de arc_student
) como S EM M.student_id = S.row_id
Outras soluções  
 
programming4us programming4us