首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我该如何正确地把这些桌子放在一起?

我该如何正确地把这些桌子放在一起?
EN

Stack Overflow用户
提问于 2013-04-17 09:44:09
回答 2查看 110关注 0票数 0

我有一张表,用来存储本周的飞机检查时间表,它叫做aircraft_sched。还有两个是相关的,一个是aircraft_sched_options,我需要将它放到第一个表中,最后一个表称为aircraft

aircraft_sched

代码语言:javascript
复制
column 1: AC_Reg (VARCHAR)(10),(PK),(FK -> `aircraft` PK)
column 2: Sched_Day1 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 3: Sched_Day2 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 4: Sched_Day3 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 5: Sched_Day4 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 6: Sched_Day5 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 7: Sched_Day6 (INT)(1),(FK -> `aircraft_sched_options` PK)
column 8: Sched_Day7 (INT)(1),(FK -> `aircraft_sched_options` PK)

aircraft_sched_options

代码语言:javascript
复制
column 1: SchedOpt_ID (INT)(1),(PK)
column 2: SchedOpt_Name (VARCHAR)(10)
column 3: SchedOpt_Color (VARCHAR)(7),

aircraft

代码语言:javascript
复制
column 1: AC_Reg (VARCHAR)(10),(PK)
column 2: AC_SN  (VARCHAR)(6)
column 3: AC_Year (VARCHAR)(4)

当一架新飞机被添加到系统中时,我有它,所以它也将它添加到aircraft_sched表中。我不认为这是正确的方式,但这就是现在的情况。因此,aircraft_sched表始终使用AC_Reg填充,Sched_DayX单元要么是NULL0,要么是与所选调度类型相对应的SchedOpt_ID编号。

我面临的问题是,当我尝试将JOINSched_DayX列改为SchedOpt_ID列时。当我只执行一个列时,它可以工作,但是如果我尝试执行多个列,那么行就会从我的结果中消失。

下面是我的代码,“有点”起作用了:

代码语言:javascript
复制
<?php
$sql = ("
          SELECT 
             * 
          FROM 
             aircraft_sched 
          INNER JOIN aircraft_sched_options AS aso1 
             ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
");

if(!$result_sql = $mysqli->query($sql))
{
    echo QueryCheck("getting the aircraft schedule ","from the aircraft sched",$mysqli) . "Error No: " .$mysqli->errno;
}

while($ACSched = $result_sql->fetch_assoc())
{
    echo "<tr>";
    echo "<td class=\"ACSched_Reg\">" . $ACSched['AC_Reg'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "<td align=\"center\" style=\"background:" . $ACSched['SchedOpt_Color'] . ";\">" . $ACSched['SchedOpt_Name'] . "</td>";
    echo "</tr>";
}
?>

当我说它“有点”的时候,我的意思是它实际上显示了一些结果。它不能工作的原因是,它在每个单元格中显示相同的结果,即使只有一天,并且指定了计划类型。

当我将第二个JOIN添加到查询中时,如下所示:

代码语言:javascript
复制
$sql = ("
          SELECT 
            * 
          FROM 
            aircraft_sched 
          INNER JOIN aircraft_sched_options AS aso1 
            ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
          INNER JOIN aircraft_sched_options AS aso2 
            ON aircraft_sched.Sched_Day2 = aso2.SchedOpt_ID
 ");

...then它只是不返回任何有记录的行。

我一直在阅读JOIN以及它们是如何工作的,解决问题的唯一方法是为每个AC_Reg设置一个单独的表,这样一周中的每一天都可以设置为UNIQUE列,但我不认为这是完成任务的最佳方式。

编辑:

这里是一些屏幕截图,以提供一个更好的视觉。

aircraft_sched

aircraft_sched_options

我的守则:

屏幕显示:

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-17 11:36:19

如果我正确地理解了您的问题,您需要为每个tbl_twoDay与表Day连接。

代码语言:javascript
复制
SELECT 
    aircraft_sched.AC_SN,
    IF(
       aso1.SchedOpt_Name IS NULL OR aso1.SchedOpt_ID = 0, 
       '-', 
       aso1.SchedOpt_Name
    ) as option1,
    IF(
       aso2.SchedOpt_Name IS NULL OR aso2.SchedOpt_ID = 0, 
       '-', 
       aso2.SchedOpt_Name
    ) as option2
FROM 
    aircraft_sched 
LEFT JOIN aircraft_sched_options AS aso1 
    ON aircraft_sched.Sched_Day1 = aso1.SchedOpt_ID
LEFT JOIN aircraft_sched_options AS aso2 
    ON aircraft_sched.Sched_Day2 = aso2.SchedOpt_ID

....

编辑:,我更新了查询,使用了LEFT JOIN而不是INNER JOIN来获取选项,因为正如您所说的,有些可能是NULL

更新:删除了aircraft连接并添加了检查选项是否为null或id为0,将显示-

票数 1
EN

Stack Overflow用户

发布于 2013-04-17 09:58:27

按照查询的逻辑,只有Day1 == Day2 == Day3 == . == Day7在tbl_one中的行以及与tbl_two.Day_ID相等的值才会出现,这有帮助吗?

代码语言:javascript
复制
SELECT * FROM tbl_one INNER JOIN tbl_two
    ON tbl_one.Day1 = tbl_two.Day_ID 
WHERE 
      tbl_one.Day1 = tbl_one.Day2
  AND tbl_one.Day1 = tbl_one.Day3
  AND tbl_one.Day1 = tbl_one.Day4
  AND tbl_one.Day1 = tbl_one.Day5
  AND tbl_one.Day1 = tbl_one.Day6
  AND tbl_one.Day1 = tbl_one.Day7
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16056736

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档