【问题标题】:PHP MySQL - Inner Join only if not nullPHP MySQL - 仅当不为空时才进行内部联接
【发布时间】:2014-05-31 14:53:00
【问题描述】:

我有一个使用 Inner Join 的 mysqli SELECT 查询,我注意到一个大问题:它不会选择条件列值为 null 的行(因为第二个表中不存在 NULL)。这是我的代码:

<?php

$sql = mysqli_connect(/* CONNECTION */);

$query =    "SELECT " .
            "e.EQUIPMENT_ID, " .
            "e.CUSTOMER_ID, " .
            "e.DESCRIPTION, " .
            "e.LOCATION, " .
            "e.JOB_SITE, " .
            "e.PROJECT_NAME, " .
            "jb.DESCRIPTION AS JOB_SITE_NAME " .
            "FROM equipments e " .
            "INNER JOIN jobsites jb ON jb.JOBSITE_ID = e.JOB_SITE " .
            "WHERE e.CUSTOMER_ID = 1 ".
            "ORDER BY e.EQUIPMENT_ID ASC";

$results = mysqli_query($sql, $query);

if(!isset($data)) $data = array(); $cc = 0;

while($info = mysqli_fetch_array($results, MYSQLI_ASSOC)){

    if(!isset($data[$cc])) $data[$cc] = array();

    ///// FROM TABLE equipments /////
    $data[$cc]['EQUIPMENT_ID'] = $info['EQUIPMENT_ID'];
    $data[$cc]['DESCRIPTION'] = $info['DESCRIPTION'];
    $data[$cc]['LOCATION'] = $info['LOCATION'];
    $data[$cc]['PROJECT_NAME'] = $info['PROJECT_NAME'];
    $data[$cc]['JOB_SITE_ID'] = $info['JOB_SITE'];

    ///// FROM TABLE jobsites /////
    $data[$cc]['JOB_SITE'] = $info['JOB_SITE_NAME'];

    $cc++;
}

print_r($data);

?>

所以,正如我所说,代码返回值,但前提是“设备”中的“JOB_SITE”列具有作业站点 ID(非空)。丑陋的解决方案是在表“jobsites”中创建一个名为“empty”的jobsite_id 的行,但如果我可以跳过这个,我会的。

只有当 e.JOB_SITE 不为空时,有没有办法加入?

【问题讨论】:

  • 使用左连接,内连接会“跳过”不完整的记录(如果连接不能完全完成则不会显示)
  • 就是这样!它适用于左连接!非常感谢!!
  • 不客气,很高兴我能帮上忙

标签: php mysql inner-join


【解决方案1】:

您可以在 SQL 查询中使用LEFT JOIN

$query =    "SELECT " .
            "e.EQUIPMENT_ID, " .
            "e.CUSTOMER_ID, " .
            "e.DESCRIPTION, " .
            "e.LOCATION, " .
            "e.JOB_SITE, " .
            "e.PROJECT_NAME, " .
            "jb.DESCRIPTION AS JOB_SITE_NAME " .
            "FROM equipments e " .
            "LEFT JOIN jobsites jb ON jb.JOBSITE_ID = e.JOB_SITE " .
            "WHERE e.CUSTOMER_ID = 1 ".
            "ORDER BY e.EQUIPMENT_ID ASC";

如果equipments 表中没有与jb.JOBSITE_ID 匹配的row,则此查询将为列JOB_SITE_NAME 返回NULL VALUE

【讨论】:

  • 埃里克在您回答之前写了一条评论,并告诉我按照您的说法使用左连接:就是这样!谢谢你们!
猜你喜欢
  • 2011-08-24
  • 2013-03-09
  • 2022-06-29
  • 2022-01-25
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
相关资源
最近更新 更多