MySQL动态确定用于内部联接的选项卡

MySQL动态确定用于内部联接的选项卡,mysql,join,inner-join,Mysql,Join,Inner Join,伙计们,我遇到了一个问题,我希望有人能帮我解决。我有个约会。例如2009-10-1。此日期用于检查我在哪个季节工作。这可能是夏天,也可能是冬天 如果在夏天,我的内部连接所用的桌子将是“summer09_rooms”。如果是冬季“冬季09_房间”。所以我基本上不想在我的内心世界里做任何事情。如何做到这一点。查询如下所示: SELECT name, arrival_date, departure_date FROM holliday a INNER JOIN ( CASE when arrival

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

如果在夏天,我的内部连接所用的桌子将是“summer09_rooms”。如果是冬季“冬季09_房间”。所以我基本上不想在我的内心世界里做任何事情。如何做到这一点。查询如下所示:

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
当然,这个查询不起作用,但现在我希望你能看到我想要实现的目标

亲切问候,


数字人类

我认为你不能这样做。想到的两个解决方法是使用子选择而不是内部联接,或者根据条件联接两个表(例如,内部联接夏季09_房间b在arribal_日期介于…和a.dossier=b.dossier内部联接冬季09_房间…)

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

这就留下了一个问题,为什么一开始你会有两张桌子

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的所有结果,这些结果在夏季和冬季都有相应的档案。

两个表中是否都有日期?是否有其他方法确定带有存储过程或函数的表“前缀”?让这更具活力?我在考虑MySQL中的PREPARE stmt FROM函数。summer09_rooms和winter09_rooms都可以引用holliday中的一份档案吗?是的。此外,“夏季”和“冬季”之后的第二个数字年可能有所不同。冬季可能有2年(因为冬季将从12月到3月),所以冬季将是“winter0910”,例如,这是不可能的,因为子选择查询将返回超过1行的值,这是因为有人一开始没有考虑“数据库设计”:(
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