简体   繁体   English

SQL INNER Join没有给出结果

[英]SQL INNER Join not giving the result

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. 因此,一个菜的当前状态是CURRENT_DATE在有效日期从有效日期到有效日期之间,而一个退休的菜的状态是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. 上面的代码返回(在DSH01数据示例中)两行,一行为$ 10,另一行为$ 12。 I need the 'r' items to contain the price from the most recent time period, or MAX(valid_to) 我需要“ r”项包含最近一段时间的价格,即MAX(valid_to)

How do I add this join / condition? 如何添加此联接/条件? I have tried a subquery without success. 我尝试了一个子查询,但没有成功。

Thanks in advance! 提前致谢!

You will need to have group the data by menu_dishes_status.dish_id. 您将需要按menu_dishes_status.dish_id对数据进行分组。 Max(valid_to) would then work nicely Max(valid_to)会很好地工作

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 像这样尝试,未经测试,就在我的头上,尝试创建一个sql小提琴以获得更多帮助

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

Here's the right SQL. 这是正确的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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM