SQL如何从每个联接表中检索最新结果



我想通过每个组(productToken(的MAX(ID(从所有连接的表中检索一个包含最新行的大型产品表,它是产品的唯一名称。联接表包括产品(商店(、可用性(状态(、描述(产品(和产品价格。所有这些表都包含唯一的productToken,并且所提到的表可以通过添加新记录(独立地(随着时间的推移而更改,所以我的目标是通过从每个表中检索最新记录来组成一个大表(包含关于产品的实际信息(。我的代码是这样的。第一个添加的产品运行良好,但在向任何表添加新记录后(查询未检索到任何结果(,情况就变得奇怪了。

SELECT *
FROM products
JOIN productsStore ON products.productToken = productStore.productToken
JOIN productsStatus ON products.productToken = productsStatus.productToken
JOIN productsPrice ON products.produstToken = productsPrice.productToken
JOIN categories ON products.categoryToken = categories.categoryToken
WHERE products.shopToken = '$shopToken' 
AND products.productID IN 
(SELECT MAX(productID) 
FROM products 
GROUP BY productToken)
AND productsPrice.productPriceID IN 
(SELECT MAX(productPriceID) 
FROM productsPrice
GROUP BY produktToken)
AND productsStatus.productStatusID IN 
(SELECT MAX(productStatusID) 
FROM productsStatus
GROUP BY productToken)
AND produktyStore.productStoreID IN 
(SELECT MAX(productStoreID) 
FROM productsStore
GROUP BY productToken)
AND categories.categoryID IN 
(SELECT MAX(categoryID) 
FROM categories
GROUP BY categoryToken)
ORDER BY categories.categoryID DESC

我想从所有连接的表中检索一个包含最新行的大型产品表

我认为您希望where子句中具有相关子查询的相等条件,而不是具有聚合查询的in条件。这使您可以使用给定productToken的"最新"记录筛选每个联接的表。

SELECT *
FROM products p
JOIN productsStore  psr ON psr.productToken = p.productToken
JOIN productsStatus psu ON psu.productToken = p.productToken
JOIN productsPrice  ppr ON ppr.produstToken = p.productToken
JOIN categories     c   ON c.categoryToken  = p.categoryToken
WHERE 
p.shopToken = '$shopToken' 
AND p.productID         = (SELECT MAX(p1.productID)         FROM products      p1   WHERE p1.productToken   = p.productToken)
AND psr.productStoreID  = (SELECT MAX(psr1.productStoreID)  FROM productsStore psr1 WHERE psr1.productToken = p.productToken)
AND psu.productStatusID = (SELECT MAX(psu1.productStatusID) FROM productStatus psu1 WHERE psu1.productToken = p.productToken)
AND ppr.productPriceID  = (SELECT MAX(ppr1.productPriceID)  FROM productsPrice ppr1 WHERE ppr1.productToken = p.productToken)
AND c.categoryID        = (SELECT MAX(c1.categoryID)        FROM category      c1   WHERE c1.productToken   = p.productToken)

如果您运行的是MySQL 8.0(或MariaDB 10.3或更高版本(,则可以在子查询中使用ROW_NUMBER()

SELECT *
FROM (
SELECT p.*, ROW_NUMBER() OVER(PARTITION BY productToken ORDER BY productID DESC) rn
FROM products p
) p
INNER JOIN (
SELECT psr.*, ROW_NUMBER() OVER(PARTITION BY productToken ORDER BY productStoreID DESC) rn
FROM productsStore psr
) psr ON psr.productToken = p.productToken AND psr.rn = 1
INNER JOIN (
SELECT psu.*, ROW_NUMBER() OVER(PARTITION BY productToken ORDER BY productStatusID DESC) rn
FROM productsStatus psu
) psu ON psu.productToken = p.productToken AND psu.rn = 1
INNER JOIN (
SELECT ppr.*, ROW_NUMBER() OVER(PARTITION BY productToken ORDER BY productsPriceID DESC) rn
FROM productsPrice ppr
) ppr ON ppr.productToken = p.productToken AND ppr.rn = 1
INNER JOIN (
SELECT c.*, ROW_NUMBER() OVER(PARTITION BY productToken ORDER BY categoryID DESC) rn
FROM categories c
) c ON c.productToken = p.productToken AND c.rn = 1
WHERE p.shopToken = '$shopToken' AND p.rn = 1

最新更新