MySQL动态确定用于内部联接的选项卡
伙计们,我遇到了一个问题,我希望有人能帮我解决。我有个约会。例如2009-10-1。此日期用于检查我在哪个季节工作。这可能是夏天,也可能是冬天 如果在夏天,我的内部连接所用的桌子将是“summer09_rooms”。如果是冬季“冬季09_房间”。所以我基本上不想在我的内心世界里做任何事情。如何做到这一点。查询如下所示: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
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