如何找到我的比萨中使用过的所有秘密成分?我在下面的评论中遗漏了SQL条件:
SELECT r.name, p.secret_ingredient FROM restaurants AS r
JOIN restaurant_has_pizzas AS rhp ON rhp.restaurant_id = r.id
JOIN pizzas AS p ON p.id = rhp.pizza_id
JOIN awarded_prizes AS a ON a.id = r.latest_prize_id
WHERE r.owner = 'me!'
AND p.created_at < a.won_at
-- AND p is as young/new as possible, i.e., p.created_at is as close to
-- a.won_at as possible; I’m only interested in the winning pizzas which
-- have been made right before the taster awarded us a prize!
;
到目前为止,该查询返回了在获奖的餐馆中使用的各种成分。但是,我只对用于赢得比萨饼的那些秘密成分感兴趣。请注意,自从我们赢得了最后一个奖项以来,我的厨师都创造了新的比萨饼。
这是DDL:
CREATE TABLE pizzas
(`id` INT NOT NULL AUTO_INCREMENT,
`created_at` DATETIME NOT NULL,
`secret_ingredient` VARCHAR(42) NOT NULL,
PRIMARY KEY (`id`))
;
INSERT INTO pizzas
(`created_at`, `secret_ingredient`)
VALUES
('2012-11-01', 'peas'),
('2012-12-01', 'pepper'),
('2012-12-11', 'pork'),
('2012-12-21', 'peanuts'),
('2012-12-31', 'oranges'),
('2013-01-02', 'ham'),
('2013-01-20', 'oranges'),
('2013-01-21', 'root beer'),
('2013-03-22', 'mushrooms')
;
CREATE TABLE awarded_prizes
(`id` INT NOT NULL AUTO_INCREMENT,
`won_at` DATETIME NOT NULL,
PRIMARY KEY (`id`))
;
INSERT INTO awarded_prizes
(`won_at`)
VALUES
('2012-12-23'),
('2013-02-02')
;
CREATE TABLE restaurants
(`id` INT NOT NULL AUTO_INCREMENT,
`name` VARCHAR(42) NOT NULL,
`owner` VARCHAR(42) NOT NULL,
`latest_prize_id` INT,
PRIMARY KEY (`id`),
CONSTRAINT `fk_restaurants_awarded_prizes1`
FOREIGN KEY (`latest_prize_id`)
REFERENCES `awarded_prizes` (`id`))
;
INSERT INTO restaurants
(`name`, `owner`, `latest_prize_id`)
VALUES
('Don Camillo', 'me!', 1),
('Tasty Pizzas', 'me!', 2),
('B. R.', 'Don Alphonso', NULL)
;
CREATE TABLE restaurant_has_pizzas
(`restaurant_id` INT NOT NULL,
`pizza_id` INT NOT NULL,
PRIMARY KEY (`restaurant_id`, `pizza_id`),
CONSTRAINT `fk_restaurant_has_pizzas_restaurants1`
FOREIGN KEY (`restaurant_id`)
REFERENCES `restaurants` (`id`),
CONSTRAINT `fk_restaurant_has_pizzas_pizzas1`
FOREIGN KEY (`pizza_id`)
REFERENCES `pizzas` (`id`))
;
INSERT INTO restaurant_has_pizzas
(`restaurant_id`, `pizza_id`)
VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5),
(2, 6),
(1, 7),
(2, 8),
(2, 9)
;
另见this SQL Fiddle。屡获殊荣的食材只是“Don Camillo”的“花生”和“美味比萨”的“根啤酒”。我不想看到SQL查询当前返回的其他成分。这是预期的结果表:
name | secret_ingredient
-------------|------------------
Don Camillo | peanuts
Tasty Pizzas | root beer
好吧,这无疑是一个基于更复杂的现实数据库模式的精心设计的例子......但后者与我的餐厅帝国相比太无聊了,无法在这里展示: - )
答案 0 :(得分:1)
SELECT a.name
, b.secret_ingredient
FROM
( SELECT r.*
, MAX(p.created_at) max_created_at
FROM restaurants r
JOIN awarded_prizes z
ON z.id = r.latest_prize_id
JOIN pizzas p
ON p.created_at <= z.won_at
GROUP
BY r.id
) a
JOIN pizzas b
ON b.created_at = a.max_created_at;
+--------------+-------------------+
| name | secret_ingredient |
+--------------+-------------------+
| Don Camillo | peanuts |
| Tasty Pizzas | root beer |
+--------------+-------------------+
我不相信这些成分中的任何一种都属于披萨附近的任何地方。