mysql - 如果表中只有一列,则 LEFT JOIN 返回 NULL

标签 mysql sql greatest-n-per-group

我尝试获取最新创建的产品价格。每个产品都是独一无二的,但可以有不同的价格。但是,我的查询仅在产品价格超过 product_price 表中的行时才有效:

Table product_price

这是我的查询:

SELECT 
    i.name AS title, 
    i.id AS product_id, 
    m.name AS manufacturer, 
    image, 
    price_sales, 
    price_new, 
    price_used, 
    price_old 
FROM product_info as i 
    LEFT JOIN product_manufacturer AS m ON i.manufacturer_id = m.id
    LEFT JOIN (SELECT * FROM product_price ORDER BY created_at DESC LIMIT 1) AS p ON i.id = p.id_product
WHERE category_id = 2 
    AND i.is_deactivated IS NULL 
LIMIT 0, 20;

我只需要最新创建的价格行。

Result

最佳答案

您遇到的问题是子查询:

(SELECT * FROM product_price ORDER BY created_at DESC LIMIT 1) 

不会获取每件产品的最新价格,而只是获取最新价格,因此只会返回一行,这意味着您的产品中只有一个实际有价格。

解决此问题的方法是删除任何存在更新价格的价格,因此为简单起见,如果您只查看价格表,以下将仅提供最新的产品价格:

SELECT  p.*
FROM    product_price AS p
WHERE   NOT EXISTS
        (   SELECT  1
            FROM    product_price AS p2
            WHERE   p2.id_product = p.id_product
            AND     p2.created_at > p.created_at 
        );

然而,MySQL will optmise LEFT JOIN/IS NULL better than NOT EXISTS (尽管我认为前者能更好地传达意图),因此更有效的方法是:

SELECT  p.*
FROM    product_price AS p
        LEFT JOIN product_price AS p2 
            ON p2.id_product = p.id_product
            AND p2.created_at > p.created_at 
WHERE   p2.id IS NULL;

最后,将其引入到您的主要查询中,您最终会得到:

SELECT  i.name AS title, 
        i.id AS product_id, 
        m.name AS manufacturer, 
        i.image, 
        p.price_sales, 
        p.price_new, 
        p.price_used, 
        p.price_old 
FROM    product_info as i 
        LEFT JOIN product_manufacturer AS m 
            ON m.id = i.manufacturer_id
        LEFT JOIN product_price AS p 
            ON p.id_product = i.id
        LEFT JOIN product_price AS p2 
            ON p2.id_product = p.id_product
            AND p2.created_at > p.created_at 
WHERE   i.category_id = 2 
AND     i.is_deactivated IS NULL 
AND     p2.id IS NULL
LIMIT 0, 20;

关于mysql - 如果表中只有一列,则 LEFT JOIN 返回 NULL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39981296/

相关文章:

mysql 最大每组按日期

php - 在 mysql 数据库中插入索引数组值

mysql super 奇怪的语法错误?

mysql - 如何从有 300'000 行的表中选择 n 行

mysql - 在 GROUP BY 中使用 LIMIT 来获得每组 N 个结果?

MySQL分组和排序

mysql - Coldfusion MySQL Query of Queries 日期选择

MySQL和索引总和

mysql - 如何使用 hsqldb 和设置数据库 SQL 常规名称

java - SQLite 删除不工作