简体   繁体   English

MySQL动态确定要与内连接一起使用的表格

[英]MySQL Dynamicly determine the tabel to use with inner join

He guys, I'm stuck with a problem and I hope someone can help me out. 他们,我遇到了问题,我希望有人可以帮助我。 I have a date. 我有个约会。 For example 2009-10-1. 例如2009-10-1。 This date is used to check in which season I am working. 这个日期用于检查我工作的季节。 This could be summer or winter. 这可能是夏天或冬天。

If whe are in the summer the table to use for my inner join whould be 'summer09_rooms'. 如果在夏天,用于我内心联系的桌子应该是'summer09_rooms'。 If winter 'winter09_rooms'. 如果冬天'winter09_rooms'。 So I basicly whant to do a CASE WHEN in my INNER JOIN. 所以我基本上想要在我的INNER JOIN中做一个案例。 How to accomplish this. 如何做到这一点。 The query would look like this: 查询看起来像这样:

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

Of course this query isn't working but now I hope you'l see what I want to accomplish. 当然这个查询不起作用,但现在我希望你能看到我想要完成的任务。

Kind regards, 亲切的问候,

Digital Human 数字人

I don't think you can do joins this way. 我认为你不能以这种方式加入。 Two workarounds that come to mind is use subselects instead of inner join or join both two tables depending on the condition (eg INNER JOIN summer09_rooms b ON arribal_date BETWEEN .... AND a.dossier=b.dossier INNER JOIN winter09_rooms...) 我想到的两个解决方法是使用子选择而不是内连接或根据条件连接两个表(例如INNER JOIN summer09_rooms b ON arribal_date BETWEEN ....和a.dossier = b.dossier INNER JOIN winter09_rooms ......)

If you don't have overlapping dates in your summer and winter tables, you could union both tables to get the required result (I am assuming they both have the same layout). 如果您的夏季和冬季表中没有重叠日期,您可以将两个表合并以获得所需的结果(我假设它们都具有相同的布局)。

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

That leaves the question though why you would have two tables in the first place. 这就留下了为什么你首先要有两张桌子的问题。

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

This way you get all results from holliday which have corresponding dossiers in summer, respective winter. 通过这种方式,您可以获得holliday的所有结果,这些结果在夏季和相应的冬季都有相应的档案。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM