Возврат данных из нескольких таблиц в одном запросе, даже если вторичные таблицы не применяются

0

У меня проблема с получением данных из трех таблиц, которые я хочу вернуть, используя один запрос. Я сделал это, прежде чем использовать запрос, похожий на этот:

$query = mysql_query("SELECT 
    maintable.`id`,
    maintable.`somedata`,
    maintable.`subtable1_id`,
    subtable1.`somedata`,
    subtable1.`subtable2_id`,
    subtable2.`somedata`
FROM
    `maintable` maintable,
    `subtable1` subtable1,
    `subtable2` subtable2
WHERE
    maintable.`somedata` = 'some_search' AND
    subtable1.`id` = maintable.`subtable1_id` AND
    subtable2.`id` = subtable1.`subtable2_id`
")or die(mysql_error());

На этот раз проблема заключается в том, что дополнительные детали могут не применяться. Мне нужно вернуть все результаты, которые соответствуют some_search в основной таблице, даже если не указано ни одного подтаблица_1.

Мне нужно что-то, что будет идти по линиям

WHERE
     maintable.`somedata` = 'some_search'
AND IF maintable.`subtable1_id` IS NOT NULL (
     WHERE subtable1.`id` = maintable.`subtable1_id` AND
     subtable2.`id` = subtable1.`subtable2_id`
)

Как вы, вероятно, догадаетесь, я не являюсь продвинутым пользователем mysql! Попытайтесь, как я мог, я не могу получить синтаксис правильно, и мне не повезло искать решения в Интернете.

Любая помощь очень ценится!

Теги:

3 ответа

1
Лучший ответ

Если я понял это правильно, вам нужно использовать MySQL LEFT JOIN. Попробуйте следующее:

SELECT 
    m.id, 
    m.somedata, 
    m.subtable1_id,
    s1.somedata,
    s1.subtable2_id,
    s2.somedata
FROM
    maintable m
LEFT JOIN
    subtable1 s1
ON
    m.subtable1_id = s1.id
LEFT JOIN
    subtable2 s2
ON
    s1.subtable2_id = s2.id
WHERE
    m.somedata = 'some search'


Это вернет данные главной таблицы, даже если в подтаблице1 или 2 ИЛИ данных основной таблицы и подтаблицы 1 нет эквивалентных данных, если нет эквивалентных данных в подтаблинке2.

  • 0
    Это работает отлично! Большое спасибо действительно
2

Похоже, что основное отличие, которое вы ищете, - это INNER JOIN и LEFT JOIN в MySQL.

INNER JOIN потребует ссылки между двумя таблицами. Должно быть совпадение с обеих сторон для возвращаемой строки.

LEFT JOIN вернет совпадения в обеих строках, например INNER, но также вернет строки из вашей основной таблицы, даже если никакие строки не совпадают во вспомогательных таблицах - их поля будут NULL.

Вы можете найти пример синтаксиса в документах.

  • 0
    Ахха, да вот билет - осталось присоединиться.
0

Как насчет этого:

WHERE
     maintable.`somedata` = 'some_search'
AND (maintable.`subtable1_id` IS NULL OR (
     subtable1.`id` = maintable.`subtable1_id` AND
     subtable2.`id` = subtable1.`subtable2_id` )
)

Имейте в виду, что это приведет к перекрестному произведению подтаблицы1 и подтаблицы2 с главной таблицей, если subtable1_id NULL.

  • 0
    +1 хорошее использование короткого замыкания.
  • 0
    Приветствия за ответ. Этот вид работает, но возвращает намного больше строк, чем должен, так как я думаю, что он проходит и считает каждую подтаблицу как строку для той же строки, что и maintable. Если это имеет смысл!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню