MySQL查询涉及3个表和2个数据库,无法获取正确的列

时间:2018-09-12 19:59:49

标签: php mysql sql

我正在使用以下查询从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时,它会返回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似乎也无法正常工作。对我可以进行哪些更改以获取正确的列有任何想法吗?

2 个答案:

答案 0 :(得分:0)

简单的JOIN应该可以很好地工作:

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.*替换为要显示的特定列。

答案 1 :(得分: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'

您可以省略“ as”一词,使其看起来更整洁,但我将其保留在其中以显示发生了什么事。