【问题标题】:Join other tables to return customized result加入其他表以返回自定义结果
【发布时间】:2022-01-05 06:03:45
【问题描述】:

我有以下表格

产品表:

id product_type product_code
200 Camera 3222333
201 Television 5432322
202 PC 4332233
203 Mac 1244532
204 Notebook 7543223

product_released_country1 表:

id product_code released_year
1 3222333 2000
2 3222333 2001
3 3222333 2003
4 5432322 2000
5 5432322 2001
6 5432322 2010

product_released_country2 表:

id product_code released_year
1 4332233 2000
2 4332233 2001
3 4332233 2009
4 1244532 2000
5 1244532 2001
6 1244532 2010

在不同国家/地区发布的产品保存在 2 个不同的表中。我需要一个查询来通过检查两个表来返回所有产品,以查看是否有任何产品已在 2010 年发布。如果产品是在 2010 年发布的,则为特定产品返回“是”。如果产品在 2010 年未发布或任何年份都未发布(例如:product_code 7543223),则查询应为 is_product_released_in_2010 列返回“no”。

预期输出:

id product_type product_code is_product_released_in_2010
200 Camera 3222333 no
201 Television 5432322 yes
202 PC 4332233 no
203 Mac 1244532 yes
204 Notebook 7543223 no

我尝试使用 union all 加入这两个表,但仍然没有得到想要的结果。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: mysql sql join plsql left-join


    【解决方案1】:

    LEFT JOIN 并检查存在

    SELECT p.id, p.product_type, p.product_code, CASE WHEN MAX(c1.id) IS NOT NULL OR MAX(c2.id) IS NOT NULL THEN 'yes' ELSE 'no' END is_product_released_in_2010
    FROM product p
    LEFT JOIN product_released_country1 c1 ON p.product_code = c1.product_code AND c1.released_year = 2010
    LEFT JOIN product_released_country2 c2 ON p.product_code = c2.product_code AND c2.released_year = 2010
    GROUP BY p.id, p.product_type, p.product_code
    

    demo

    【讨论】:

    • 感谢您的查询效果很好。假设我想获得最新发布的年份而不是按 2010 年和是/否过滤,(例如:对于产品代码 3222333 - 年份是 2003 年,对于 4332233 - 年份是 2009 年和 1244532 - 年份是 2010 年,是否有更简单的方法?
    • @user3376592 remove left join condition released_year = 2010SELECT GREATEST(MAX(c1.released_year), MAX(c2.released_year)) 将为您提供每种产品的最新年份。
    • 我按照你的建议尝试了,但我得到的年份为空值:SELECT p.id, p.product_type, p.product_code, GREATEST(MAX(c1.released_year), MAX(c2.released_year )) FROM product p LEFT JOIN product_released_country1 c1 ON p.product_code = c1.product_code LEFT JOIN product_released_country2 c2 ON p.product_code = c2.product_code GROUP BY p.id, p.product_type, p.product_code
    • @user3376592 检查此链接dbfiddle.uk/…
    • 哇,你真是个天才。今天学到了很多东西,非常感谢先生的时间和帮助。另外,最后一个问题。假设在 product_released_country1 和 product_released_country2 表中还有其他列,例如 deleted_month、quantity_released、released_day 等。我们如何根据 latest_year 获取这些值?
    【解决方案2】:

    你可以用计数和联合来做到这一点

    select 
    p.id, 
    p.product_type, 
    p.product_code ,
    (select count(*) from
      (select product_code, released_year from product_released_country1
      union all
      select product_code, released_year from product_released_country2) as t
    where t.product_code = p.product_code and t.released_year=2010)>0 as is_product_released_in_2010
    from product p
    

    example here

    【讨论】:

    • 谢谢你很有用。我会试试这个,我假设这会比加入更快?另外,如果我想获得最新发布的年份而不是按 2010 年和是/否过滤,(例如:对于产品代码 3222333 - 年份是 2003 年,对于 4332233 - 年份是 2009 年和 1244532 - 年份是 2010 年,是否有更简单的方法?
    • 我认为左连接更快,但我的查询更容易理解。要获得最大年份,您可以使用以下查询 select p.id, p.product_type, p.product_code , ifnull((select max(t.released_year) from (select product_code, released_year from product_released_country1 union all select product_code, released_year from product_released_country2) as t where t.product_code = p.product_code ),1970) as max_year from product p 我已经更新了 example
    • 非常感谢您的宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-03
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2013-10-24
    • 2013-12-27
    相关资源
    最近更新 更多