【问题标题】:MySQL Dynamicly determine the tabel to use with inner joinMySQL 动态确定要与内部连接一起使用的表
【发布时间】:2011-03-03 20:46:27
【问题描述】:

伙计们,我遇到了一个问题,希望有人可以帮助我。我有个约会。例如 2009 年 10 月 1 日。该日期用于检查我在哪个季节工作。这可能是夏天或冬天。

如果在夏天,用于我的内部连接的表应该是“summer09_rooms”。如果是冬天 'winter09_rooms'。所以我基本上想在我的 INNER JOIN 中做一个 CASE。如何做到这一点。查询如下所示:

SELECT name, arrival_date, departure_date FROM holliday a
INNER JOIN 
(
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN summer09_rooms b 
ELSE winter09_rooms b END
)
ON a.dossier=b.dossier

当然,这个查询不起作用,但现在我希望你能看到我想要完成的任务。

亲切的问候,

数字人类

【问题讨论】:

  • 两个表中是否都存在日期?
  • 是否有另一种方法来确定具有存储过程或函数的表“前缀”?为了更加动态地实现这一点?我在考虑 MySQL 中的 PREPARE stmt FROM 函数。
  • 可以同时引用 holliday 的一个档案吗?summer09_rooms 和 winter09_rooms
  • 是的,它可以。此外,“夏季”和“冬季”之后的 2 位数年份可能不同。冬天可以有 2 年(因为冬天是从 12 月到 3 月),所以冬天会是 'winter0910' 例如

标签: mysql join inner-join


【解决方案1】:

我认为您不能以这种方式进行连接。想到的两种解决方法是使用子选择而不是内部联接或根据条件联接两个表(例如 INNER JOIN summer09_rooms b ON arribal_date BETWEEN .... AND a.dossier=b.dossier INNER JOIN winter09_rooms ...)

【讨论】:

  • 这是不可能的,因为子选择查询将返回多于 1 行
【解决方案2】:

如果您的夏季和冬季表格中没有重叠的日期,您可以合并两个表格以获得所需的结果(我假设它们都具有相同的布局)。

SELECT  name
        , arrival_date
        , departure_date 
FROM    holliday a
        INNER JOIN (
          SELECT * FROM summer09_rooms
          UNION ALL SELECT * FROM winter09_rooms
        ) b ON a.dossier = b.dossier

虽然为什么你首先会有两张桌子,但这留下了一个问题。

【讨论】:

  • 是的,那是因为有人一开始就没有考虑“数据库设计”............ :(
【解决方案3】:
SELECT 
name, 
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN
s.arrival_date else w.arrival_date end as arrival_date,
CASE when arrival_date BETWEEN 2009-10-1 AND 2009-4-1 THEN
s.departure_date  else w.departure_date  end as departure_date 

FROM holliday a
left JOIN summer09_rooms s on a.dossier=s.dossier and s.arrival_date BETWEEN 2009-10-1 AND 2009-4-1
left JOIN winter09_rooms w on a.dossier=w.dossier and NOT w.arrival_date BETWEEN 2009-10-1 AND 2009-4-1

这样你就可以得到所有的 holliday 的结果,这些结果在夏天和冬天都有相应的档案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-16
    • 2019-09-04
    • 1970-01-01
    • 2017-06-24
    • 2017-08-30
    • 2011-04-20
    • 2011-08-15
    • 2016-09-21
    相关资源
    最近更新 更多