MySQL Query, вовлекающий 3 таблицы и 2 базы данных, не может получить правильные столбцы

0

Я использую следующий запрос для извлечения данных из 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, похоже, не работает. Любые идеи о том, какие изменения я мог бы внести, чтобы получить правильные столбцы?

  • 1
    SELECT recipies.title, ... Если у вас есть имена столбцов, которые существуют в нескольких таблицах, которые являются частью вашего запроса, вы должны добавить префикс имени столбца к имени таблицы (или псевдониму таблицы).
Теги:

2 ответа

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

Простые 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.* На определенные столбцы, которые вы хотите показать.

0

Я давно привык к тому, что всегда ставил псевдоним/имя таблицы перед каждым полем запроса. Таким образом, вы можете позже изменить запрос, не беспокоясь о именах полей, которые конфликтуют при добавлении таблиц в запрос. Я также предпочитаю присоединение к нескольким таблицам 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'

Вы можете оставить слово "как", чтобы оно выглядело немного чище, но я оставляю его там, чтобы показать, что происходит немного лучше.

Ещё вопросы

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