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

68de4m5k  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(317)

我使用下面的查询从3个表中提取数据。2个在同一个数据库中,1个在不同的数据库中。基本上我在一张table上有食谱,我用的是 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 这个 UNION 似乎不太管用。我能做些什么改变来得到正确的栏目,你有什么想法吗?

4szc88ey

4szc88ey1#

简单联接应该很好地工作:

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

f0brbegy

f0brbegy2#

我很久以前就养成了一个习惯,总是把表别名/名称放在查询的每个字段之前。这样,您就可以在以后修改查询,而不用担心在向查询中添加表时字段名会发生冲突。我也更喜欢联接而不是来自多个表(更容易理解逻辑)
我将您的第一个查询改为:

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”这个词留出来让它看起来更干净,但我把它放在那里是为了更好地显示发生了什么。

相关问题