2012-11-17 24 views
1

问候并感谢您阅读我的问题。mySQL,多个连接在不同条件的同一个表上。在查询中重命名列

首先,下图描绘了我创建的数据库的一部分。我的目标(除非有更好的方法来做到这一点)是为通常被称为“schedule_name”和“schedule_description”之类的字段支持多种语言到一个单独的表中。 P.S--我知道这个图中的列类型被严重标记。

database

正如你所看到的,船,邮轮和安排各有一个languageid为外键。如果我想用巡航和船只取出计划记录,我该怎么办?

我有表加入没有问题,列别名'排序,但是,想要获得正确的细节到每个别名。为了清楚

计划有它自己的language_language_id参考使用LANGUAGE_ID = 1个 language_name_en被挑选出 - 周一早晨

克鲁斯有它自己的language_language_id参考使用LANGUAGE_ID = 2 language_name_en被挑选出 - 阳光阴霾

船有它自己的language_language_id参考使用LANGUAGE_ID = 3 language_name_en是挑出 - 蓝海豚

回答这个问题的评论; en是英文,zhs是简体中文,zht是繁体中文。这些是该系统支持动态数据的语言。我认为这样布局表格会很方便,因此可以有一个只负责处理语言的用户类型;无需处理调度表。

到目前为止,我相信我的查询会去如下获得样本记录作为事后表示:

SELECT 
    schedule_id, 
    s.language_name_en as schedule_name_en, 
    l.language_name_zhs as schedule_name_zhs, 
    l.language_name_zht as schedule_name_zht, 
    schedulesafename, 
    schedule_expected_arrival, 
    schedule_expected_departure, 
    cruise_id, 
    c.language_name_en as cruise_name_en, 
    c.language_name_zhs as cruise_name_zhs, 
    c.language_name_zht as cruise_name_zht 
    FROM 
     schedule as s 
    INNER JOIN 
     language as l 
     ON s.language_language_id = l.language_id 
    INNER JOIN 
     cruise as c 
     ON c.language_language_id = l.language_id 
    Where 
     schedule_id = 1; 

这里是什么我想用列举的查询返回的一些样本数据。

scheduleid - 1 
schedule_name_en - monday morning 
schedule_name_zhs - 星期一的早晨 
schedule_name_zht - 星期一的早晨 
schedule_safename - pwupglfkpmwcbkgzhmzxrqfeqzlhvaed 
schedule_expected_arrival - 1353138308 
schedule_expected_departure - 1353139218 
cruise_id - 1 
cruise_name_en - Sunny Haze 
cruise_name_zhs - 彩霞 
cruise_name_zht - 彩霞 
cruise_safename - bbhdrunzdmftyvhprefvogysgfrtnkgm 

这给你一个想法,我想从数据库中获取数据。我的主要问题是如何在相同的查询中翻译语言记录。感谢您阅读我的问题。

+0

只是为我的问题添加一点范围,我错过了澄清一些歧义。我在运行时也很熟悉列重命名,并且会添加一个关于我相信事情应该如何的快速查询。 – Symbal

+0

在做了一些更多的研究之后,我遇到了使用子查询来实现该壮举的前景。我相信使用子查询会让优化器感到困惑吗? – Symbal

+0

我不认为子查询会混淆优化器。但你的问题让我困惑。我不确定你的问题是什么,真的。你想知道如何制作列别名?或者是什么? –

回答

4

我觉得你很接近,你只需要重新使用不同的别名各表相同语言表这是怎么回事了......像

SELECT 
     S.schedule_id, 
     SL.language_name_en as schedule_name_en, 
     SL.language_name_zhs as schedule_name_zhs, 
     SL.language_name_zht as schedule_name_zht, 
     schedulesafename, 
     S.schedule_expected_arrival, 
     S.schedule_expected_departure, 
     C.cruise_id, 
     CL.language_name_en as cruise_name_en, 
     CL.language_name_zhs as cruise_name_zhs, 
     CL.language_name_zht as cruise_name_zht 
    FROM 
     schedule as s 
     INNER JOIN language as SL 
      ON s.language_language_id = SL.language_id 
     INNER JOIN cruise as c 
      on s.Cruise_Cruise_ID = c.Cruise_Id 
      INNER JOIN language as CL 
       ON c.language_language_id = CL.language_id 
    Where 
     S.schedule_id = 1; 

首先注意,日程安排(别名S)加入语言(第一次在计划语言ID连接中被别名为“SL”作为计划语言)。

接下来,计划将加入CRUISE的Cruise ID。

最后,CRUISE表通过CRUISE语言ID值连接到语言表(这次是克鲁斯语言的别名“CL”)。

因此,您现在拥有两次相同的表格源,每个表格都是您试图拉出的相应“语言ID”元素。

+0

我觉得开明,谢谢,你的回答非常感谢。我们每天都会学到新东西。它工作迅速。你的解释非常清楚,比SQL解释更好。 – Symbal

+0

@SimonBall,很高兴帮助。由于您的SQL已经有一个下降格式,因此请注意我的版本如何显示每个源与下一个表之间的嵌套关系......然后从计划到巡航到巡航语言......在语言下缩进...帮助保持面向的东西我从哪里得到东西。 – DRapp

相关问题