Я использую следующий запрос для извлечения данных из 3 таблиц. 2 находятся в одной базе данных и 1 в другой базе данных. В основном у меня есть рецепты в одной таблице, и я использую таблицу recipieToCountry
для подключения к таблице countries
поэтому я знаю, к какой стране принадлежит рецепт.
$contentQuery = $page->dbf->query("
SELECT *
FROM recipes, recipeToCountry, content.countries
WHERE recipes.id = recipeToCountry.recipeId
AND recipeToCountry.countryId = content.countries.id
AND content.countries.origId = '$country'
");
Проблема, с которой я $content->title
- это когда я называю $content->title
он возвращает название из countries
когда я хочу получить название из recipies
. Мое понимание SELECT *
- проблема, поэтому я попытался изменить запрос на это:
SELECT title, description, approved, active, id, recipeId, countryId
FROM recipes, recipeToCountry
WHERE recipes.id = recipeToCountry.recipeId
UNION
SELECT id, origId, null, null, null, null, null
FROM content.countries
WHERE content.countries.origId = 1
AND recipeToCountry.countryId = content.countries.id
К сожалению, этот запрос имеет ошибку, и я не уверен, как его исправить. Когда я удалил последний AND
UNION
, похоже, не работает. Любые идеи о том, какие изменения я мог бы внести, чтобы получить правильные столбцы?
Простые JOINs должны работать хорошо:
select r.*, c.*
from recipes r
join repiceToCountry rc on r.id = rc.recipeId
join content.countries c on c.id = rc.countryId
where c.origId = '$country'
Вы должны убедиться, что у вас есть привилегии SELECT
в другой базе данных.
Кроме того, вы можете заменить r.*, c.*
На определенные столбцы, которые вы хотите показать.
Я давно привык к тому, что всегда ставил псевдоним/имя таблицы перед каждым полем запроса. Таким образом, вы можете позже изменить запрос, не беспокоясь о именах полей, которые конфликтуют при добавлении таблиц в запрос. Я также предпочитаю присоединение к нескольким таблицам FROM. (Легче видеть логику)
Я бы изменил ваш первый запрос:
SELECT r.*, c.country /* any other fields in country besides title */
FROM recipes as r
LEFT JOIN recipeToCountry as rtc ON rtc.recipeId = r.id
LEFT JOIN content.countries as c ON c.id = rtc.countryId
WHERE c.origId = '$country'
Вы можете оставить слово "как", чтобы оно выглядело немного чище, но я оставляю его там, чтобы показать, что происходит немного лучше.
SELECT recipies.title, ...
Если у вас есть имена столбцов, которые существуют в нескольких таблицах, которые являются частью вашего запроса, вы должны добавить префикс имени столбца к имени таблицы (или псевдониму таблицы).