克服SQL查询中的歧义字段错误

克服SQL查询中的歧义字段错误,sql,mysql,Sql,Mysql,我有4个表和这个查询 SELECT tag.id, title FROM tag LEFT JOIN tag_map ON ( tag.id = tag_map.tag_id ) LEFT JOIN post ON ( post.id = post_id ) LEFT JOIN game ON ( game.id = post_id ) LEFT JOIN video ON ( video.id = post_id ) WHERE tag_slug = "blizzard" ORDER

我有4个表和这个查询

SELECT tag.id, title
FROM tag
LEFT JOIN tag_map ON ( tag.id = tag_map.tag_id ) 
LEFT JOIN post ON ( post.id = post_id ) 
LEFT JOIN game ON ( game.id = post_id ) 
LEFT JOIN video ON ( video.id = post_id ) 
WHERE tag_slug =  "blizzard"
ORDER BY tag_map.post_type
此查询中的问题是,左侧join语句中的3个表都有一个标题列。由于这个原因,我在字段列表中得到的列“title”是一个不明确的错误


如何处理此问题,以便查询显示每行的相关标题字段。

您需要指定希望标题来自哪个表。猜测游戏中的标题,您需要指定game.title

如果我是你,我会开始考虑使用临时表将其拆分。虽然4个连接没有什么问题,但它确实开始变得令人困惑

临时表示例:


在您的场景中,您将创建一个临时表,然后根据各个连接使用INSERT和UPDATE填充它,因此最后您所要做的就是根据另一个响应的注释中提供的附加信息从@TENTRABLE

中选择*,似乎需要根据post_类型选择不同的标题字段,post_类型对应于post、game和video表

我假设post_类型是一个单字符的文本列

您可以通过两种方式来实现这一点,使用LEFT JOIN或UNION

SELECT tag.id, 
CASE post_type 
   WHEN 'P' THEN post.title 
   WHEN 'V' THEN video.title 
   WHEN 'G' THEN game.title
END CASE
FROM tag
LEFT JOIN tag_map ON ( tag.id = tag_map.tag_id ) 
LEFT JOIN post ON ( post.id = post_id ) 
LEFT JOIN game ON ( game.id = post_id ) 
LEFT JOIN video ON ( video.id = post_id ) 
WHERE tag_slug =  "blizzard"
ORDER BY tag_map.post_type
但是,工会解决方案可能更明确:

SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN post ON tag_map.post_id = post.id
UNION ALL
SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN game ON tag_map.post_id = game.id
UNION ALL
SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN video ON tag_map.post_id = video.id
WHERE tag_slug =  "blizzard"
ORDER BY tag_map.post_type

请注意,我稍微简化了答案,因为我不清楚标记和标记映射之间的关系,您可能需要将这两个表引入到选择中。

我尝试了这种方法。但是,此查询返回许多不必要的数据。例如,当您获得一行视频时,该行将包含无用的帖子和游戏标题。我想知道是否有更好的方法来做到这一点。@Sinan,只需在列列表中省略post.title和game.title。@Larry这不是问题。右侧字段可以是每行三个字段之一,具体取决于帖子_type@Sinan:啊哈。你的问题不清楚。我将发布一个答案。当a.positionSELECT tag.id, CASE post_type WHEN 'P' THEN post.title WHEN 'V' THEN video.title WHEN 'G' THEN game.title END CASE FROM tag LEFT JOIN tag_map ON ( tag.id = tag_map.tag_id ) LEFT JOIN post ON ( post.id = post_id ) LEFT JOIN game ON ( game.id = post_id ) LEFT JOIN video ON ( video.id = post_id ) WHERE tag_slug = "blizzard" ORDER BY tag_map.post_type
SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN post ON tag_map.post_id = post.id
UNION ALL
SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN game ON tag_map.post_id = game.id
UNION ALL
SELECT tag.id, post_type, title 
  FROM tag_map INNER JOIN video ON tag_map.post_id = video.id
WHERE tag_slug =  "blizzard"
ORDER BY tag_map.post_type