LEFT JOIN returns NULL 如果 table 中只有一列
LEFT JOIN returns NULL if there are just one column in table
我尝试获取最新创建的产品价格。每个产品都是独一无二的,但可以有不同的价格。但是,我的查询仅在产品的价格超过 product_price table:
行时才有效
这是我的查询:
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)
不会获取每件产品的最新价格,而只是获取最新价格,因此只会 return 一行,这意味着您的产品中只有一个实际有价格。
解决这个问题的方法是删除任何存在更新价格的价格,因此为简单起见,如果您只查看价格 table,以下将只为您提供最新的产品价格:
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;
我尝试获取最新创建的产品价格。每个产品都是独一无二的,但可以有不同的价格。但是,我的查询仅在产品的价格超过 product_price table:
行时才有效这是我的查询:
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)
不会获取每件产品的最新价格,而只是获取最新价格,因此只会 return 一行,这意味着您的产品中只有一个实际有价格。
解决这个问题的方法是删除任何存在更新价格的价格,因此为简单起见,如果您只查看价格 table,以下将只为您提供最新的产品价格:
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;