从表中选择n行,其中类别在另一个表中定义

时间:2018-02-20 09:18:46

标签: mysql

我有一个offers表,其中item表中的项目配置为商品。此表中的项目以不同的价格重复。

items表中,有些项目属于不同的类别。有一个单独的category表,由items表通过外键关系引用。

现在,出于我的特定目的,我想从category表格中选择每个offers的两个项目,这些项目可以重复,但每个类别不超过2个。我还想在单个查询或存储过程中执行这些任务。

我尝试了以下内容 https://stackoverflow.com/a/6732697/4742713 这需要我使用联合和多个选择语句,每次更改category ID,但我不希望使用联盟,因为将来可能会添加类别。

我也试过这个解决方案https://stackoverflow.com/a/1092038/4742713,它使用mysql变量作为计数器,但它不一致,并且重复了相同类别的行(超过预期)。 如果有帮助,下面是我的表

CREATE TABLE `itemcat` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `name` varchar(50) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `itemcat`
  ADD UNIQUE `name` (`name`);

INSERT INTO `itemcat` (`id`, `name`) VALUES
(1, 'C1'),
(2, 'C2'),
(3, 'C3'),
(4, 'C4'),
(5, 'C5');


CREATE TABLE `item` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `cat_id` int(11) DEFAULT '1',
  `name` varchar(200) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

ALTER TABLE `item`
  ADD KEY `item_fk0` (`cat_id`);

ALTER TABLE `item`
  ADD CONSTRAINT `item_fk0` FOREIGN KEY (`cat_id`) REFERENCES `itemcat` (`id`);

INSERT INTO `item` (`cat_id`, `name`) VALUES
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E'),
(1, 'F'),
(2, 'G'),
(3, 'H'),
(4, 'I'),
(5, 'J'),
(1, 'K'),
(2, 'L'),
(3, 'M'),
(4, 'N'),
(5, 'O'),
(1, 'P'),
(2, 'Q'),
(3, 'R'),
(4, 'S'),
(5, 'T'),
(1, 'A'),
(2, 'B'),
(3, 'C'),
(4, 'D'),
(5, 'E'),
(1, 'F'),
(2, 'G'),
(3, 'H'),
(4, 'I'),
(5, 'J'),
(1, 'K'),
(2, 'L'),
(3, 'M'),
(4, 'N'),
(5, 'O'),
(1, 'P'),
(2, 'Q'),
(3, 'R'),
(4, 'S'),
(5, 'T');
CREATE TABLE `offer` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `item_id` int(11) NOT NULL,
  `regular_price` decimal(10,2) DEFAULT NULL,
  `offer_price` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


INSERT INTO `offer` (`item_id`, `regular_price`, `offer_price`) VALUES
( 1, '499.00', '199.00'),
( 2, '299.00', '149.00'),
( 3, '599.00', '199.00'),
( 4, '999.00', '399.00'),
( 5, '199.00', '99.00'),
( 5, '199.00', '79.00'),
( 6, '299.00', '199.00'),
( 6, '399.00', '199.00'),
( 6, '1099.00', '499.00'),
( 6, '3590.00', '1299.00'),
( 7, '15900.00', '12990.00'),
( 7, '20990.00', '12990.00'),
( 8, '35999.00', '19990.00'),
( 8, '110.00', '85.00'),
( 9, '10990.00', '7990.00'),
( 9, '510.00', '329.00'),
( 9, '35.00', '12.00'),
( 9, '60.00', '35.00'),
( 10, '149.00', '69.00'),
( 10, '168.00', '119.00'),
( 10, '358.00', '139.00'),
( 10, '514.00', '438.00'),
( 12, '158.00', '133.00'),
( 12, '152.00', '127.00'),
( 12, '42.00', '36.00'),
( 12, '25.00', '21.00'),
( 12, '335.00', '281.00'),
( 1, '421.00', '359.00'),
( 2, '299.00', '149.00'),
( 1, '499.00', '199.00'),
( 2, '499.00', '199.00'),
( 4, '299.00', '149.00'),
( 3, '599.00', '199.00'),
( 5, '999.00', '399.00'),
( 5, '199.00', '99.00'),
( 7, '199.00', '79.00'),
( 6, '299.00', '199.00'),
( 1, '399.00', '199.00'),
( 2, '1099.00', '499.00'),
( 6, '3590.00', '1299.00'),
( 8, '15900.00', '12990.00'),
( 9, '20990.00', '12990.00'),
( 5, '35999.00', '19990.00'),
( 1, '110.00', '85.00'),
( 7, '10990.00', '7990.00'),
( 2, '510.00', '329.00'),
( 3, '35.00', '12.00'),
( 4, '60.00', '35.00'),
( 15, '149.00', '69.00'),
( 16, '168.00', '119.00'),
( 17, '358.00', '139.00'),
( 6, '158.00', '133.00'),
( 18, '152.00', '127.00'),
( 19, '42.00', '36.00'),
( 12, '25.00', '21.00'),
( 12, '180.00', '139.00'),
( 12, '139.00', '99.00'),
( 12, '301.00', '89.00'),
( 12, '199.00', '109.00'),
( 12, '350.00', '179.00'),
( 15, '299.00', '149.00'),
( 13, '999.00', '349.00'),
( 13, '145.00', '120.00'),
( 15, '108.00', '88.00'),
( 15, '485.00', '335.00'),
( 13, '240.00', '199.00'),
( 13, '199.00', '172.00'),
( 15, '930.00', '599.00'),
( 13, '399.00', '289.00'),
( 8, '99.00', '49.00'),
( 15, '60.00', '40.00'),
( 15, '125.00', '67.00'),
( 22, '864.00', '449.00'),
( 13, NULL, '249.00'),
( 3, '514.00', '438.00'),
( 12, '550.00', '369.00'),
( 11, '205.00', '175.00'),
( 11, NULL, '58.00'),
( 11, '1200.00', '799.00'),
( 11, '1200.00', '849.00'),
( 15, '396.00', '350.00'),
( 11, '1200.00', '849.00'),
( 11, '1550.00', '1349.00'),
( 11, '335.00', '281.00'),
( 11, '421.00', '359.00'),
( 12, '299.00', '149.00'),
( 1, '499.00', '199.00'),
( 2, '499.00', '199.00'),
( 2, '299.00', '149.00'),
( 3, '599.00', '199.00'),
( 5, '999.00', '399.00'),
( 6, '199.00', '99.00'),
( 7, '199.00', '79.00'),
( 10, '299.00', '199.00'),
( 1, '399.00', '199.00'),
( 2, '1099.00', '499.00'),
( 6, '3590.00', '1299.00'),
( 8, '15900.00', '12990.00'),
( 9, '20990.00', '12990.00'),
( 5, '35999.00', '19990.00'),
( 11, '110.00', '85.00'),
( 7, '10990.00', '7990.00'),
( 12, '510.00', '329.00'),
( 13, '35.00', '12.00'),
( 14, '60.00', '35.00'),
( 15, '149.00', '69.00'),
( 16, '168.00', '119.00'),
( 17, '358.00', '139.00'),
( 11, NULL, '58.00');

ALTER TABLE `offer`
  ADD KEY `offer_fk1` (`item_id`);


ALTER TABLE `offer`
  ADD CONSTRAINT `offer_fk1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE;
COMMIT;

现在,对于上面的Schema,我想运行

select i.name as item_name, ic.name as cat_name, o.regular_price, o.offer_price from offer o, item i, itemcat ic where i.cat_id=ic.id and o.item_id=i.id limit 30

从这张表的输出中我想选择每个类别的2个项目

对于之前的混乱感到抱歉。

谢谢大家!

0 个答案:

没有答案