一尘不染

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

sql

我的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


阅读 162

收藏
2021-03-08

共1个答案

一尘不染

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”下作为商人ID分组在一起。

对于每个商人ID,这是一个查询,它将仅显示商人提出的一个要约(按字典顺序排序时具有名字的那个要约)。

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连接。

2021-03-08