car
| id | brand | available |
|---|---|---|
| 1 | toyota | yes |
| 2 | nissan | yes |
| 3 | masda | no |
| 4 | tesla | yes |
purchase
| id_car | date | price |
|---|---|---|
| 1 | 2020-01 | $50 |
| 1 | 2020-02 | $52 |
| 2 | 2020-01 | $43 |
| 3 | 2020-01 | $35 |
| 3 | 2020-02 | $32 |
| 3 | 2020-03 | $15 |
| 4 | 2020-03 | $43 |
I need results like in the following table
| id | brand | available | date | price |
|---|---|---|---|---|
| 1 | toyota | yes | 2020-01 | $50 |
| 1 | toyota | yes | 2020-02 | $52 |
| 2 | nissan | yes | 2020-01 | $43 |
| 2 | nissan | yes | 2020-02 | null |
| 4 | tesla | yes | 2020-01 | null |
| 4 | tesla | yes | 2020-02 | null |
my query search must use availability and date(array)
select .....
join ....
where
car.available = 'yes'
and purchase.date in ('2020-01', '2020-02')
CodePudding user response:
We can use a calendar table cross join approach here:
SELECT c.id, c.brand, 'yes' AS available, d.date, p.price
FROM (SELECT id, brand FROM car WHERE available = 'yes') c
CROSS JOIN (SELECT DISTINCT date FROM purchase) d
LEFT JOIN purchase p
ON p.id_car = c.id AND p.date = d.date
WHERE d.date IN ('2020-01', '2020-02')
ORDER BY c.id;
The idea is to generate two sets, one for all available car brands, and the other for all known available dates. We then left join this intermediate table to the purchase table to get the output you want.
