Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.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/0/windows/17.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从3个关系表中为每个产品选择N个最新的行_Mysql - Fatal编程技术网

MySQL从3个关系表中为每个产品选择N个最新的行

MySQL从3个关系表中为每个产品选择N个最新的行,mysql,Mysql,现在我有了返回每个产品最新记录的代码。但我不知道如何修改它以获得例如每个产品的3个最新行。 我想比较最新的产品价格,我需要每个最新的几行 商店 产品 价格 对于特定shopId的products表中的每个产品,此命令仅从prices表中返回1条最新记录 例如,如果shopId=1,则此命令仅获取我在此处省略的记录,即检索到的其他表中的数据: 230 | 1 | 18 | 2137 | 2021-03-11 05:55:25 232 | 1 | 20

现在我有了返回每个产品最新记录的代码。但我不知道如何修改它以获得例如每个产品的3个最新行。 我想比较最新的产品价格,我需要每个最新的几行

商店 产品 价格 对于特定shopId的products表中的每个产品,此命令仅从prices表中返回1条最新记录

例如,如果shopId=1,则此命令仅获取我在此处省略的记录,即检索到的其他表中的数据:

230 | 1      | 18       | 2137  | 2021-03-11 05:55:25
232 | 1      | 20       | 5001  | 2021-03-11 20:18:01
但我想获得shopId=1的每个产品的2条最新记录,因此我想获得的记录:

(shops)id | (shops)shopId | title | active | price | dDateAdded
 1        | 2345          | Honda | 1      | 2256  | 2021-03-10 18:22:13
 1        | 2345          | Honda | 1      | 2137  | 2021-03-10 14:15:56
 1        | 2345          | VW    | 1      | 5321  | 2021-03-11 05:55:25
 1        | 2345          | VW    | 1      | 5001  | 2021-03-11 20:18:01

要选择N个最新的行,需要分配行号并按N行进行筛选。但是,MySQL 5.7中不支持ROW_NUMBER函数。 因此,您需要模拟行数函数,如下所示:

通过向查询中添加行号为的子查询,可以获得所需的结果,如下所示:

选择 s、 身份证, s、 肖皮德, c、 头衔, c、 活跃的, d、 价格, d、 添加 从商店里买来的 在c.shopId=s.id上以c的形式左键连接产品 d.productId=c.id和d.shopId=s.id上的左连接价格为d - 左连接 选择 p1.id, COUNTp2.ddatadded+1行\u num 从价格p1向左连接价格p2 在p1.shopId=p2.shopId和 p1.productId=p2.productId和 p1.ddateddedw、 你的mysql版本是什么?mysql版本。5.7.33此外,显示数据库模式、示例数据、当前和预期输出、与产品对应的列以及要订购的列。我添加了表结构和示例。非常感谢您的回复,但恐怕这不是我想要的。也许我再写一次我想要的输出。我编辑了主要帖子。添加了一个查询以获得您想要的结果。
id  | shopId | productId | price | dDateAdded
-----------------------------------------------------
224 | 1      | 18       | 2385  | 2021-03-09 12:39:57
225 | 2      | 19       | 1523  | 2021-03-09 13:14:44
226 | 1      | 20       | 5489  | 2021-03-09 17:32:18
227 | 1      | 18       | 2256  | 2021-03-10 18:22:13
228 | 2      | 19       | 1600  | 2021-03-10 21:33:21
229 | 1      | 20       | 5321  | 2021-03-10 14:15:56
230 | 1      | 18       | 2137  | 2021-03-11 05:55:25
231 | 2      | 19       | 1666  | 2021-03-11 17:31:49
232 | 1      | 20       | 5001  | 2021-03-11 20:18:01
SELECT s.*, c.*, d.*
FROM shops AS s
LEFT JOIN products AS c ON c.shopId = s.id
LEFT JOIN (
SELECT productId, MAX(dDateAdded) MaxDate
FROM prices
GROUP BY productId
) MaxDates
ON MaxDates.productId = c.id
LEFT JOIN prices AS d ON d.productId = c.id AND d.shopId = s.id AND MaxDates.MaxDate = d.dDateAdded
WHERE s.id = ".$shopId."
230 | 1      | 18       | 2137  | 2021-03-11 05:55:25
232 | 1      | 20       | 5001  | 2021-03-11 20:18:01
(shops)id | (shops)shopId | title | active | price | dDateAdded
 1        | 2345          | Honda | 1      | 2256  | 2021-03-10 18:22:13
 1        | 2345          | Honda | 1      | 2137  | 2021-03-10 14:15:56
 1        | 2345          | VW    | 1      | 5321  | 2021-03-11 05:55:25
 1        | 2345          | VW    | 1      | 5001  | 2021-03-11 20:18:01