Mysql语句(FULL JOIN上的语法错误)

时间:2011-01-25 20:54:52

标签: sql mysql mysql-error-1064

我的sql语句有什么问题,它说问题就在FULL JOIN附近,但我很难过:

SELECT `o`.`name` AS `offername`, `m`.`name` AS `merchantName` 
FROM `offer` AS `o` 
FULL JOIN `offerorder` AS `of` ON of.offerId = o.id 
INNER JOIN `merchant` AS `m` ON o.merchantId = m.id 
GROUP BY `of`.`merchantId` 

请温柔,因为我不是sql fundi

1 个答案:

答案 0 :(得分:3)

MySQL不提供完全加入,您可以使用

  • 一对LEFT + RIGHT和UNION;或
  • 使用LEFT,RIGHT和INNER以及UNION ALL的三元组

查询也非常错误,因为你有一个GROUP BY,但你的SELECT列不是聚合。

将此正确转换为LEFT + RIGHT + UNION之后,您仍然存在从每个不同of.merchantid的任意随机记录中获取商品名称和商家名称的问题,甚至不一定来自同一记录。

因为你对o.merchant有一个INNER JOIN条件,所以不需要FULL JOIN,因为"offerorder"中没有匹配的"offer"记录将失败INNER JOIN。这将它变成LEFT JOIN(可选)。由于您要对of.merchantid进行分组,因此任何丢失的offerorder条记录都会在“NULL”下组合在一起作为商家。

这是一个可行的查询,对于每个商家,它只会显示商家制作的一个商品(按字典顺序排序时具有名字的商品)。

SELECT MIN(o.name) AS offername, m.name AS merchantName 
FROM offer AS o 
LEFT JOIN offerorder AS `of` ON `of`.offerId = o.id 
INNER JOIN merchant AS m ON o.merchantId = m.id 
GROUP BY `of`.merchantId, m.name

注意:加入o.merchantid = m.id非常可疑。你是说of.merchantid = m.id吗?如果是这种情况,请将LEFT更改为RIGHT join。