Mysql 如何连接表,同时限制第三个表中最近两行的数据?
我如何选择所有产品及其类别名称,以及每个产品只有两个最新价格Mysql 如何连接表,同时限制第三个表中最近两行的数据?,mysql,Mysql,我如何选择所有产品及其类别名称,以及每个产品只有两个最新价格 SELECT products.product_name, categories.category_name, prices.price FROM products INNER JOIN categories ON products.category_id = categories.id INNER JOIN ( SELECT prices.price, prices.p
SELECT
products.product_name,
categories.category_name,
prices.price
FROM
products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT
prices.price,
prices.product_id
FROM
prices
ORDER BY
created_at DESC
) as prices
ON prices.product_id = products.id
GROUP BY products.product_name, categories.category_name, prices.price
产品
价格
类别
这是我的方法,它连接所有数据。若我在第二个内部联接上加上限制2,我总共只得到两行。如何获得所有产品,但每个产品只有两个最新价格
SELECT
products.product_name,
categories.category_name,
prices.price
FROM
products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT
prices.price,
prices.product_id
FROM
prices
ORDER BY
created_at DESC
) as prices
ON prices.product_id = products.id
GROUP BY products.product_name, categories.category_name, prices.price
这些数据可用于生成表和为表种子
SET FOREIGN_KEY_CHECKS=0;
DROP TABLE IF EXISTS `categories`;
CREATE TABLE `categories` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1;
INSERT INTO `categories` VALUES ('1', 'fruits');
INSERT INTO `categories` VALUES ('2', 'vegetables');
INSERT INTO `categories` VALUES ('3', 'seeds');
DROP TABLE IF EXISTS `prices`;
CREATE TABLE `prices` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`price` int(11) DEFAULT NULL,
`product_id` int(11) DEFAULT NULL,
`created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=17 DEFAULT CHARSET=latin1;
INSERT INTO `prices` VALUES ('1', '2', '1', '2017-01-07 04:03:45');
INSERT INTO `prices` VALUES ('2', '3', '2', '2017-01-07 04:03:45');
INSERT INTO `prices` VALUES ('3', '4', '3', '2017-01-07 04:03:45');
INSERT INTO `prices` VALUES ('4', '2', '4', '2017-01-07 04:03:45');
INSERT INTO `prices` VALUES ('5', '5', '1', '2017-02-07 04:03:45');
INSERT INTO `prices` VALUES ('6', '6', '2', '2017-02-07 04:03:45');
INSERT INTO `prices` VALUES ('7', '3', '3', '2017-02-07 04:03:45');
INSERT INTO `prices` VALUES ('8', '2', '4', '2017-02-07 04:03:45');
INSERT INTO `prices` VALUES ('9', '3', '1', '2017-03-10 06:03:45');
INSERT INTO `prices` VALUES ('10', '6', '2', '2017-03-10 06:03:45');
INSERT INTO `prices` VALUES ('11', '7', '3', '2017-03-10 06:03:45');
INSERT INTO `prices` VALUES ('12', '3', '4', '2017-03-10 06:03:45');
INSERT INTO `prices` VALUES ('13', '5', '1', '2017-03-10 09:03:45');
INSERT INTO `prices` VALUES ('14', '2', '2', '2017-03-10 09:03:45');
INSERT INTO `prices` VALUES ('15', '6', '3', '2017-03-10 09:03:45');
DROP TABLE IF EXISTS `products`;
CREATE TABLE `products` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_name` varchar(255) DEFAULT NULL,
`category_id` int(11) NOT NULL,
`created_at` date DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `f_category` (`category_id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;
INSERT INTO `products` VALUES ('1', 'apples', '1', '2017-01-10');
INSERT INTO `products` VALUES ('2', 'pears', '1', '2017-01-10');
INSERT INTO `products` VALUES ('3', 'tomatoes', '2', '2017-01-10');
INSERT INTO `products` VALUES ('4', 'walnuts', '3', '2017-01-10');
您是否尝试过以下方法:
SELECT
products.product_name,
categories.category_name,
prices.price
FROM
products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT TOP 2
prices.price,
prices.product_id
FROM
prices
ORDER BY
created_at DESC
) as prices
试试这个。。使用价格限制表
SELECT products.product_name, categories.category_name, prices.price
FROM products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT prices.price, prices.product_id
FROM prices
ORDER BY created_at DESC
LIMIT 2
) AS prices
注意:-西红柿是一种水果。这不能正确连接,因此如果只有苹果的最新价格为5555,那么每种产品的价格都会相同。我使用MySQL,所以我想我不能使用SELECT TOP。但结果和@Muhammad写的一样
SELECT
products.product_name,
categories.category_name,
prices.price
FROM
products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT TOP 2
prices.price,
prices.product_id
FROM
prices
ORDER BY
created_at DESC
) as prices
SELECT products.product_name, categories.category_name, prices.price
FROM products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT prices.price, prices.product_id
FROM prices
ORDER BY created_at DESC
LIMIT 2
) AS prices
SELECT products.product_name, categories.category_name, p.id,p.price
FROM products
INNER JOIN categories ON products.category_id = categories.id
INNER JOIN (
SELECT p.id,p.price, p.product_id,
if(p.product_id <> @p, @rn:=1,@rn:=@rn+1) rn,
@p:= p.product_id
FROM (select @rn:=0, @p:=0) rn,prices p
ORDER BY p.product_id, p.id DESC
) AS p on p.product_id = products.id and (p.rn in (1,2))
order by products.id, p.id desc;