Вопрос : соединения осложненные mySQL и subqueries

Еще раз, мой разум испуг потребностью обрабатывать множественные «алтернативы» using соединения. Он все приходит от небезупречной структуры базы данных, I " m конечно, но то не могущий быть предметом переговоров на этом time.

Essentially представляет 2 параллельных структуры в пределах такого же DB - для каждой таблицы, будут также варианты arc_ (архивохранилища) того таблица для более старых показателей, оптимизировать поиски на более в настоящее время показателях. Anyhoo, это ни здесь ни там - вопрос теперь пишет вопросам против ОБОИХ потребности sets.

I ответ немедленно, поэтому я как раз иду написать это вне здесь, в упованиях что как раз писать вне вопрос дает мне ключ к ответу и, наилучшим образом, если некоторый экспертный гений вне там, то (AngelIII, я смотрю ВАС!) видит это в времени, хорошей тантьеме!

Oh, и _need_ I для того чтобы сделать это в одиночном вопросе mySQL, даже если я буду сочинительством оно вне в логически «шагах», дорога оптимизатор ought причалить разрешать показатель set.

1. находят все сообщения где название = «здравствулте!» ИЛИ все arc_messages где название = «здравствулте!»
2. (соединения) для любого сообщения, соединяет на `получателя `; для любого arc_message, соедините на `arc_recipient
3. `, котор получает удостоверение личности от показателя ``реципиентного или ``arc_recipient. Этим удостоверением личности будет чужой ключ к ИЛИ `студента `ИЛИ ``arc_student, но мы не знаем which.
4. using это удостоверение личности, не соединяем на `студента `ИЛИ ``arc_student и не даем мне name

So:

message - > извещение - > студент ИЛИ arc_student
arc_message - > arc_notification - > студент ИЛИ arc_student

It чувствует как я хочу что-то как:
select M.*,
S.name
from (
выбирает message.*, notification.*
от message
соединяет извещение на message.notification_id = notification.row_id
где message.title = 'union

br/>
hello'< выбирают arc_message.*, arc_notification.*
от arc_message
соединяет arc_notification на arc_message.notification_id = arc_notification.row_id
где arc_message.title = 'br/> hello'<) как M

join (
выбирает student.name
от student
где student.row_id = M.student_id <-- неизвестное union

колонки M.student_id

выбирает arc_student.name
от arc_student
где arc_student.row_id = M.student.id <-- неизвестная колонка M.student_id
) по мере того как S


but конечно m из объема внутри этого пункта join.

My, я не хочет налево соединить студента, arc_student снаружи, потому что после этого я с 2 таблицами которые я постоянн иду ifnull (student.name, arc_student.name) как studentName etc…. и пока оно кажется довольно тривиальным в этом упрощенном примере, оно идет не получить грязно в реальном (более большом) query.

Is там поистине никакую дорогу сделать результат (student_id) от первого subquery (соединение сообщения/arc_message) в объеме для студента/arc_student соединяет?

It было бы просто если была корреляция между arc_message - > arc_student и сообщения - > студент, то но несчастливо то не будет как раз case.

I smogло положить студента/arc_student соединения как другой subselect внутри сообщения/arc_message, но с другой стороны я делать его дважды, не я? Раз для сообщения и раз для arc_message, и того как раз кажет как оно был резервн и произвести декартовый крест product.

Hmmm, возможно внутренний subselect не будет плохой идеей….
class= " ясное " >

Ответ : соединения осложненные mySQL и subqueries

Задвижка что если студент (row_id) появляется и в студента и arc_student НО С ПО-РАЗНОМУ ИМЕНЕМ… наилучшим образом, то, вы идет получить перекрестный продукт.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
выберите M.*, S.name
от
(
  выберите message.*, notification.*
  от сообщения
  соедините извещение на message.notification_id = notification.row_id
  где message.title = «здравствулте!»
соединение
  выберите arc_message.*, arc_notification.*
  от arc_message
  соедините arc_notification на arc_message.notification_id = arc_notification.row_id
  где arc_message.title = «здравствулте!»
) как m
соедините (
  выберите student.row_id, student.name
  от студента
соединение
  выберите arc_student.row_id, arc_student.name
  от arc_student
) как S НА M.student_id = S.row_id
Другие решения  
  •  Как я добавляю кнопки на форме PDF для того чтобы добавить/извлекаю рядки данных?
  •  Шнур ошибки в блоке задвижки?
  •  сколько вариант сервера SQL на одной машине
  •  Внешний вид 2007 не может архивный файл открытой сети сохраненный
  •  Активно директория DNS записывает вопрос
  •  Отчет о доступа 2010 экспорта к CSV с коллекторами?
  •  Прокладчик OCE 9400 не начинает
  •  как добавить десятичное место в формуле в отчете о кристалла seagate
  •  Windows XP и Мичрософт Оутлоок и проблемы установителя Windows
  •  VB6 к VS2010 - консультации тренировки?
  •  
    programming4us programming4us