Domanda

I have a mysqli SELECT query that is using an Inner Join and I noticed a big problem: it doesn't select rows where the column value for the condition is null (because NULL doesn't exist in the second table). Here's my code:

<?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);

?>

So, as I said, the code returns values but only if the column "JOB_SITE" inside "equipments" has a jobsite id (not null). The ugly solution is to create a row inside the table "jobsites" with a jobsite_id named "empty", but if I can skip this, I will.

Is there a way to join only if e.JOB_SITE is not null ?

È stato utile?

Soluzione

You can use LEFT JOIN in SQL query.

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

This query will return NULL VALUE for column JOB_SITE_NAME if there is no row matching jb.JOBSITE_ID in equipments table

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top