繁体   English   中英

SQL INNER Join没有给出结果

[英]SQL INNER Join not giving the result

我有两个表,信息如下:

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

第一个表包含菜肴,第二个表包含菜肴的状态。 因此,一个菜的当前状态是CURRENT_DATE在有效日期从有效日期到有效日期之间,而一个退休的菜的状态是MAX(valid_to)<CURRENT_DATE。

我正在加入这些表并对数据进行分类:

'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.

查询(在论坛的帮助下)为:

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

上面的代码返回(在DSH01数据示例中)两行,一行为$ 10,另一行为$ 12。 我需要“ r”项包含最近一段时间的价格,即MAX(valid_to)

如何添加此联接/条件? 我尝试了一个子查询,但没有成功。

提前致谢!

您将需要按menu_dishes_status.dish_id对数据进行分组。 Max(valid_to)会很好地工作

尝试这个

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

让我知道这个是否奏效

试试这个,可能会有所帮助。

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

像这样尝试,未经测试,就在我的头上,尝试创建一个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

这是正确的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_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