MySQL Query, который может получить данные, которые я ищу? - PullRequest
3 голосов
/ 16 июня 2010

В проекте, над которым я работаю, я застрял в структуре таблицы из Hades.Необходимо помнить две вещи:

  1. Я не могу изменить структуру таблицы прямо сейчас.Я застрял с ним на данный момент.
  2. Запросы генерируются динамически и не жестко закодированы.Поэтому, когда я запрашиваю запрос, который может получить эти данные, я действительно работаю над алгоритмом, который будет генерировать нужный мне запрос.

Надеюсь, я смогу объяснить проблему, не делаяВаши глаза остекленели, а ваш мозг взорвался.

У нас есть таблица экземпляров, которая выглядит (упрощенно) следующим образом:

Instances
InstanceID    active
1              Y
2              Y
3              Y
4              N
5              Y
6              Y

Затем, есть несколько таблиц данных вдоль этих строк:

Table1

InstanceID    field1   reference_field2
1             John      5
2             Sally        NULL
3             Fred          6
4             Joe          NULL


Table2
InstanceID    field3 
5              1
6              1


Table3
InstanceID    fieldID    field4
5               1        Howard
5               2        James
6               2        Betty

Обратите внимание, что поле reference_field2 в таблице Table1 содержит ссылку на другой экземпляр.Поле 3 в таблице 2 немного сложнее.Он содержит fieldID для Таблицы 3.

Мне нужен запрос, который выдаст мне следующий список:

InstanceID    field1     field4     
1              John      Howard
2              Sally
3              Fred

Проблема в том, что в запросе, который у меня есть, яне получайте Фреда, потому что в Table3 нет записи для fieldID 1 и InstanceID 6. Итак, самый лучший список, который я смог получить до сих пор, это

InstanceID    field1     field4     
1              John      Howard
2              Sally

По сути, если есть записьв таблице 1 для поля 2, и в таблице 3 нет записи с экземпляром instanceID, содержащимся в field2, и идентификатором поля, содержащимся в field3, я не получаю данные из field1.

Я смотрел наприсоединяется, пока у меня не посинет лицо, и я не вижу способа справиться со случаем, когда в table3 нет записи.

Ответы [ 2 ]

2 голосов
/ 16 июня 2010

LEFT JOIN ...

SELECT a.InstanceID, b.field1, d.field4
FROM instances AS a 
    JOIN Table1 AS b ON a.InstanceID = b.InstanceID
    LEFT JOIN Table2 AS c ON b.reference_field2 = c.InstanceID
    LEFT JOIN Table3 AS d ON (c.InstanceID = d.InstanceID AND c.field3 = d.fieldId)
WHERE a.active = 'Y'

Два левых соединения должны обрабатывать случай, когда нет других строк ...

1 голос
/ 16 июня 2010

Было бы полезно, если бы вы опубликовали свой запрос, потому что я думаю, что у вас есть некоторые ошибки в описаниях таблиц здесь, поэтому не очень понятно, как эти таблицы связаны.

В любом случае, у вас, вероятно, есть внутреннее объединение в вашем запросе (обычно записывается как JOIN). Замените его левым внешним соединением (LEFT JOIN). Это не потребует, чтобы правильная таблица содержала строку и возвращала NULL вместо фактического значения.

...