I have two tables with info as follows:
Table: menu_dishes
dish_id dish_title ingredients
DSH01 Bacon & Eggs Bacon, eggs
Table: menu_dishes_status
dish_id valid_from valid_to price
DSH01 2013-10-10 2013-12-31 10.00
DSH01 2014-01-01 2014-02-28 12.00
The first table contains the dishes, the second, contains the dishes' status. So a dish's current status is one where CURRENT_DATE is between valid_from and valid_to dates, and a retired dish is one where the MAX(valid_to) < CURRENT_DATE.
I am joining these tables and categorizing the data:
'n' NEW => WHERE CURRENT_DATE BETWEEN valid_from AND (valid_from + 1 MOTNH)
'c' CURRENT => WHERE CURRENT_DATE > (valid_from + 1 MOTNH)
'r' RETIRED => the rest of the rows, so the "dish_id" items not in the tables above, BUT
returning the values from the row containing MAX(valid_to) date.
The query (with help from the forum) is:
SELECT
menu_dishes.dish_id,
menu_dishes.dish_title,
menu_dishes.ingredients,
menu_dishes_status.price,
CASE
WHEN
CURRENT_DATE BETWEEN menu_table_status.valid_from
AND DATE_ADD(menu_table_status.valid_from, INTERVAL 1 MONTH)
AND CURRENT_DATE < menu_table_status.valid_to
THEN 'n'
WHEN
CURRENT_DATE > DATE_ADD(menu_table_status.valid_from_date, INTERVAL 1 MONTH)
AND CURRENT_DATE < menu_table_status.valid_to
THEN 'c'
ELSE 'r'
END as status
FROM menu_dishes
INNER JOIN
menu_dishes_status ON (menu_dishes.dish_id = menu_dishes_status.dish_id)
ORDER BY menu_dishes.dish_title ASC
The above returns (in the case of DSH01 data example) two rows, one with $10, and one with $12. I need the 'r' items to contain the price from the most recent time period, or MAX(valid_to)
How do I add this join / condition? I have tried a subquery without success.
Thanks in advance!
Here's the right SQL. Thank you all for your help:
SELECT
menu_dishes.dish_id,
menu_dishes.dish_title,
menu_dishes.ingredients,
menu_dishes_status.price,
CASE
WHEN
CURRENT_DATE BETWEEN menu_table_status.valid_from
AND DATE_ADD(menu_table_status.valid_from, INTERVAL 1 MONTH)
AND CURRENT_DATE <= menu_table_status.valid_to
THEN 'n'
WHEN
CURRENT_DATE > DATE_ADD(menu_table_status.valid_from_date, INTERVAL 1 MONTH)
AND CURRENT_DATE <= menu_table_status.valid_to
THEN 'c'
ELSE 'r'
END as status
FROM menu_dishes
INNER JOIN
menu_dishes_status ON (menu_dishes.dish_id = menu_dishes_status.dish_id)
WHERE menu_dishes_status.valid_to_date = (SELECT MAX(intab.valid_to_date)
FROM menu_dishes_status AS intab
WHERE intab.dish_id = menu_dishes_status.dish_id)
ORDER BY menu_dishes.dish_title ASC
You will need to have group the data by menu_dishes_status.dish_id. Max(valid_to) would then work nicely
Try this
FROM menu_dishes
INNER JOIN
menu_dishes_status ON (menu_dishes.dish_id = menu_dishes_status.dish_id)
group by menu_dishes_status.dish_id having MAX(valid_to)
ORDER BY menu_dishes.dish_title ASC
Let me know if this works
Try this, it might help.
CASE
WHEN ((CURRENT_DATE BETWEEN menu_table_status.valid_from AND
DATE_ADD(menu_table_status.valid_from, INTERVAL 1 MONTH))
AND CURRENT_DATE < menu_table_status.valid_to)
THEN 'n'
WHEN ((CURRENT_DATE > DATE_ADD(menu_table_status.valid_from_date, INTERVAL 1 MONTH))
AND CURRENT_DATE < menu_table_status.valid_to)
THEN 'c'
ELSE 'r'
END as status
Try it like this, not tested, just off the top of my head, try creating an sql fiddle for more help
SELECT
menu_dishes.dish_id,
menu_dishes.dish_title,
menu_dishes.ingredients,
menu_dishes_status.price,
CASE
WHEN
CURRENT_DATE BETWEEN menu_table_status.valid_from
AND DATE_ADD(menu_table_status.valid_from, INTERVAL 1 MONTH)
AND CURRENT_DATE < menu_table_status.valid_to
THEN 'n'
WHEN
CURRENT_DATE > DATE_ADD(menu_table_status.valid_from_date, INTERVAL 1 MONTH)
AND CURRENT_DATE < menu_table_status.valid_to
THEN 'c'
ELSE 'r'
END as status
FROM menu_dishes
INNER JOIN
menu_dishes_status ON (menu_dishes.dish_id = menu_dishes_status.dish_id)
WHERE menu_dishes_status.valid_to=(SELECT MAX(valid_to) FROM menu_dishes_status WHERE menu_dishes_status.dish_id=menu_dishes.dish_id)
ORDER BY menu_dishes.dish_title ASC