SQL查询:如何查找不同类似记录集中某些列的最大值?

时间:2014-12-05 17:47:30

标签: mysql sql

如何找到我的比萨中使用过的所有秘密成分?我在下面的评论中遗漏了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

背景

好吧,这无疑是一个基于更复杂的现实数据库模式的精心设计的例子......但后者与我的餐厅帝国相比太无聊了,无法在这里展示: - )

1 个答案:

答案 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         |
 +--------------+-------------------+

我不相信这些成分中的任何一种都属于披萨附近的任何地方。