У меня проблема с получением данных из трех таблиц, которые я хочу вернуть, используя один запрос. Я сделал это, прежде чем использовать запрос, похожий на этот:
$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! Попытайтесь, как я мог, я не могу получить синтаксис правильно, и мне не повезло искать решения в Интернете.
Любая помощь очень ценится!
Если я понял это правильно, вам нужно использовать 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.
Похоже, что основное отличие, которое вы ищете, - это INNER JOIN и LEFT JOIN в MySQL.
INNER JOIN потребует ссылки между двумя таблицами. Должно быть совпадение с обеих сторон для возвращаемой строки.
LEFT JOIN вернет совпадения в обеих строках, например INNER, но также вернет строки из вашей основной таблицы, даже если никакие строки не совпадают во вспомогательных таблицах - их поля будут NULL.
Как насчет этого:
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.