Mysql 从没有子查询的两个表的联接中获取ID最大的行
在这两个表上实现联接查询时遇到问题 产品表包含产品。 ProductInstance表包含定价随时间变化的产品版本 即使每个storeId为null,也应该有一行,但应该包含最高的productInstanceId 我的查询可以获取每个产品ID最大的行,但忽略StoreID。Mysql 从没有子查询的两个表的联接中获取ID最大的行,mysql,database,left-join,Mysql,Database,Left Join,在这两个表上实现联接查询时遇到问题 产品表包含产品。 ProductInstance表包含定价随时间变化的产品版本 即使每个storeId为null,也应该有一行,但应该包含最高的productInstanceId 我的查询可以获取每个产品ID最大的行,但忽略StoreID。 Select P.id as productId, PI.id as productInstanceId, P.name, PI.storeId, PI.price from products as P LEFT JO
Select P.id as productId, PI.id as productInstanceId, P.name, PI.storeId, PI.price from products as P
LEFT JOIN productInstances AS PI
ON PI.productId = P.id
LEFT JOIN productInstances AS PI2
ON (PI2.productId = P.id and (PI.id < PI2.id ) )
WHERE PI2.id IS NULL
AND PI.id IS NOT NULL
使用此查询插入测试数据
INSERT INTO `TestDB`.`products` (`name`) VALUES ('Product 1');
INSERT INTO `TestDB`.`products` (`name`) VALUES ('Product 2');
INSERT INTO `TestDB`.`productInstances` (`storeId`, `productId`, `price`) VALUES ('1', '1', '111');
INSERT INTO `TestDB`.`productInstances` (`productId`, `price`) VALUES ('1', '122');
INSERT INTO `TestDB`.`productInstances` (`productId`, `price`) VALUES ('1', '133');
INSERT INTO `TestDB`.`productInstances` (`storeId`, `productId`, `price`) VALUES ('1', '1', '115');
INSERT INTO `TestDB`.`productInstances` (`storeId`, `productId`, `price`) VALUES ('2', '1', '155');
对于MySql 8.0+,您可以使用
ROW\u NUMBER()
窗口函数获取每个productid
和storeid
的最大id:
select p.id productId,
pi.id productInstanceId,
p.name,
pi.storeId,
pi.price
from products p
left join (
select *, row_number() over (partition by storeId, productId order by id desc) rn
from productInstances
) pi on pi.productId = p.id and pi.rn = 1
对于以前的版本,可以对相关子查询执行相同的操作:
select p.id as productId,
pi.id as productInstanceId,
p.name,
pi.storeId,
pi.price
from products p
left join (
select pi.* from productInstances pi
where pi.id = (
select max(id)
from productInstances
where productId = pi.productId and storeId <=> pi.storeId
)
) pi on pi.productId = p.id
你的MySql版本是什么?这能回答你的问题吗?请不要编辑它们,包括对注释采取行动,包括剪切粘贴并运行,包括说明第1个子表达式没有给出您期望的内容、您期望的内容和原因。为什么没有子查询?在这种情况下,您必须加入子查询,而不是表本身。而且,与连接相比,子查询并不总是效率低下的。没有这样的一般规则。这取决于需求和数据。我使用的是mysql版本5.7。我试试你的答案。谢谢
select p.id as productId,
pi.id as productInstanceId,
p.name,
pi.storeId,
pi.price
from products p
left join (
select pi.* from productInstances pi
where pi.id = (
select max(id)
from productInstances
where productId = pi.productId and storeId <=> pi.storeId
)
) pi on pi.productId = p.id
> productId | productInstanceId | name | storeId | price
> --------: | ----------------: | :-------- | ------: | ----:
> 1 | 3 | Product 1 | null | 133
> 1 | 4 | Product 1 | 1 | 115
> 1 | 5 | Product 1 | 2 | 155
> 2 | null | Product 2 | null | null