查询无法与左连接(mysql)一起正常工作

ecfdbz9o  于 2021-06-18  发布在  Mysql
关注(0)|答案(3)|浏览(354)

我仍然在努力解决这个问题(我之前的文章是关于这个问题的,因为我更改了表参数,所以我遇到了另一个问题):
(有些列已经更改,所以这是一个不同的问题,因为我只有id as字段来获取最后一个insert)
餐桌产品:

id  name
1   TV
2   RADIO
3   COMPUTER

表销售(产品标识是指产品的fk):

id_sales    feedback    product_id
4           GOOD        2
5           GOOD        3
6           NICE        3

我使用的查询:

SELECT products.name, sl.feed 
FROM products LEFT JOIN (
SELECT product_id, max(id_sales), feedback AS feed FROM sales GROUP BY product_id) sl
ON products.id = sl.product_id

结果是:

name         feed   
TV           NULL
RADIO        GOOD
COMPUTER     GOOD

它适用于电视和广播,但在专栏电脑,我必须显示最后的反馈,你可以看到它的'好',而不是'好'!不知何故,使用sql函数max(id\u sales)并不是我想象中的解决方案。我错过了什么?

ippsafx7

ippsafx71#

使用子查询和左联接

select p.name,t1.feedback from products p
  left join
    (
    select t.id_sales,t.product_id,s.feedback 
       from
    (
    select max(id_sales) as id_sales,product_id from sales  
    group by product_id 
    ) t join sales s on  t.id_sales=s.id_sales
    ) t1 on p.id=t1.product_id
eivnm1vs

eivnm1vs2#

最好的方法是 row_number() ,但这可能不可用。因此,您可以筛选 ON 条款:

SELECT p.name, sl.feed 
FROM products p LEFT JOIN
     sales s
     ON p.id = s.product_id AND
        s.id_sales = (SELECT MAX(s2.id_sales) FROM sales s2 WHERE s2.product_id = s.product_id);

有其他方法来表达这种逻辑。这种方法的一大优点是可以最大限度地利用索引来提高性能。

ldioqlga

ldioqlga3#

SELECT products.name, sl.feed FROM products LEFT JOIN ( SELECT product_id, rank() over (partition by product_id Order by id_Sales desc) pRank, feedback AS feed FROM sales ) sl ON products.id = sl.product_id where sl.pRank = 1 这对你有用吗?

相关问题