php - 我如何正确地 `JOIN` 这些表?

标签 php mysql join

我有一个表用于存储本周的飞机检查时间表,它称为aircraft_sched。还有另外两个相关的,一个称为aircraft_sched_options,我需要将其加入第一个表,最后一个表称为aircraft .

aircraft_sched:

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:

column 1: SchedOpt_ID (INT)(1),(PK)
column 2: SchedOpt_Name (VARCHAR)(10)
column 3: SchedOpt_Color (VARCHAR)(7),

飞机

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 单元格要么是 0(对于 ) NULL 或与所选计划类型对应的 SchedOpt_ID 数字。

我面临的问题是当我尝试将 Sched_DayXJOINSchedOpt_ID 列时。当我只 JOIN 一列时,它有点有效,但如果我尝试执行不止一列,那么该行就会从我的结果中消失。

这是我的代码,“有点”有效:

<?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 添加到查询中时,如下所示:

$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
 ");

...那么它不会返回任何有记录的行。

我一直在阅读JOIN及其工作原理,我能想到解决问题的唯一方法是为每个AC_Reg建立一个单独的表,所以一周中的每一天都可以设置为 UNIQUE 列,但我不认为这是完成任务的最佳方式。

编辑:

以下是一些屏幕截图,可以提供更好的视觉效果。

aircraft_sched:

aircraft_sched

aircraft_sched_options:

aircraft_sched_options

我的代码:

php code

屏幕显示:

what displays on the screen

最佳答案

如果我正确理解你的问题,你需要与表tbl_two连接对于每Day :

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 -将显示

关于php - 我如何正确地 `JOIN` 这些表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16056736/

相关文章:

ruby-on-rails - 两个表之间的连接在 Activerecord 中失败,出现未初始化的常量错误

MySQL 加入无重复

sql - 在 SQL 或 MySQL 中,我们可以连接一个表和一个子查询结果吗?

php - 如何在 php 中将 ASCII 转换为 UTF-8

用于检查用户名和密码字段的 Javascript 函数,如果它们没有相应地完成则停止

java - Bing map 地理数据解压缩算法移植到 PHP

PHP json_encode($_POST) 和 mySQL 问题

PHP Mysql自动报价?

php - 按天计算受欢迎程度的公式?

php - 手动添加图像到产品 - Magento 1.4.0.1