首页 > 解决方案 > postgreSQL - 查找特定工具的下一课

问题描述

我正在尝试编写一个 PostgreSQL 查询来列出两种可供出租的乐器,每月租金最低,还告诉每个列出的乐器的下一课何时安排。我有这两张表:

//Table lesson
lesson_id | instrument_type | start
001       | 01            | 2021-02-01 
002       | 01            | 2021-02-02
003       | 02            | 2021-02-04
004       | 02            | 2021-02-05
005       | 03            | 2021-02-06

//Table instrument
instrument_id | fee_per_month | availability
01            | 300           | yes
02            | 400           | no
03            | 500           | yes

而且我要:

instrument_type | fee_per_month | lesson_id | start
01            | 300           | 001       | 2021-02-01
03            | 500           | 005       | 2021-02-06

SQL 对我来说是新的,我已经尽了最大努力但没有成功:

SELECT
instrument.type AS "instrument",
instrument.fee_per_month AS "fee/month",
lesson.start AS "next lesson"

FROM instrument, lesson

LEFT JOIN LATERAL (
    SELECT lesson.*
    FROM lesson
    WHERE lesson.start >= current_timestamp AND lesson.instrument_type = instrument.type
    ORDER BY lesson.start
    limit 1
) lesson on true
GROUP BY "instrument", "rent/month", "next lesson"
ORDER BY "rent/month"
limit 2;

我应该如何正确地做到这一点?

标签: sqlpostgresql

解决方案


嗯。. . 我认为你在正确的轨道上。如果我理解正确:

SELECT i.instrument_id AS "instrument", i.fee_per_month,
       l.lesson_id, l.start AS "next lesson"
FROM instrument i LEFT JOIN LATERAL
     (SELECT l.*
      FROM lesson l
      WHERE l.start >= current_timestamp AND
            l.instrument_id = i.instrument_id
      ORDER BY l.start
      LIMIT 1
     ) l
     ON true
WHERE i.availability = 'yes'
ORDER BY i.fee_per_month
LIMIT 2;

这修复了查询、逻辑和事物的名称。 是一个 db<>fiddle。

主要区别在于:

  • instrument和之间没有笛卡尔积lesson
  • 引入表别名,使查询更易于编写和阅读。
  • 删除GROUP BY. 不需要聚合。

推荐阅读