1

1 つのテーブルにオフィスのリストと、各オフィスのすべての短期リースのリストがあります。

両方のテーブルにクエリを実行して、すべてのオフィスのリスト、予約された最も早いリース、および再び利用可能になった最後のリースを表示しようとしています。

SELECT offices.* ,MIN(lease.date_start), MAX(lease.date_end) FROM offices, lease WHERE lease.office_id = office.id ORDER BY office.id DESC

オフィステーブル:

id        | office_name | office_description 
1         | North York  | Lorem Ipsum
2         | Toronto     | Lorem Ipsum
3         | Richmond    | Lorem Ipsum

リース テーブル:

id        | office_id   | start_date   | end_date 
1         | 1           | 5            | 8
2         | 1           | 3            | 7 
3         | 2           | 1            | 4 

私が取得しようとしている結果:

office_id=>1, start_date=>3, end_date=>8
office_id=>2, start_date=>1, end_date=>4
office_id=>3, start_date=>NULL, end_date=>NULL

その結果を得るには、クエリをどのように構成すればよいでしょうか?

4

4 に答える 4

0
SELECT office_id,
MIN(start_date) as start_date,
MAX(end_date) as end_date
FROM office 
LEFT JOIN lease ON (lease.office_id = office.office_id)
GROUP BY office_id
ORDER BY office_id ASC

また

SELECT office_id, start_date, end_date FROM (
SELECT office_id,
MIN(start_date) as start_date,
MAX(end_date) as end_date
FROM lease GROUP BY office_id
UNION
SELECT id AS office_id,
NULL start_date, NULL end_date
FROM office 
WHERE NOT EXISTS 
(SELECT 1 FROM lease
WHERE office_id=office.id) ) u
ORDER BY office_id ASC

どちらが速いかはわかりません。

于 2013-10-23T20:31:30.467 に答える
0

次の選択により、目的の結果が得られるはずです。

SELECT o.*, min(l.date_start), max(l.date_end)  
FROM offices o
LEFT JOIN lease l on (
   l.office_id = o.id
)
GROUP BY o.id
于 2013-10-23T20:26:58.937 に答える