Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 从没有子查询的两个表的联接中获取ID最大的行_Mysql_Database_Left Join - Fatal编程技术网

Mysql 从没有子查询的两个表的联接中获取ID最大的行

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

在这两个表上实现联接查询时遇到问题

产品表包含产品。 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 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