MySQL JOIN是否为null

时间:2018-06-30 03:25:23

标签: mysql sql join

我在使用MySQL和PHP时还很不熟练,但是我有一个正在为一个朋友工作的项目,该项目涉及从两个表中选择数据并将它们组合成一个结果-看起来很简单。

表1 有13个字段,但重要的字段是 id (自动递增,主键)和 serial (唯一)。其余的只是客户说明等,等等。

图片具有3个字段, picID (自动递增,主键), imagePath serial < / p>

我需要从表1中检索所有数据,如果“图片”中有匹配的照片(由相同的序列标识-每个序列只能有1张照片),那么也要检索该数据。然后,我从Table1输出数据,并使用Pictures中的 imagePath 从HTML中构建图像(如果已上传图像)。

我一直在使用的查询是:

$sql = "SELECT * FROM Table1 LEFT JOIN Pictures ON Table1.serial = Pictures.serial ORDER BY Table1.serial";

这似乎很完美,除了 Table1 中的任何一行在 Pictures 中没有照片匹配项,序列不再返回其余数据,尽管该行的其余部分都是正确的。

我研究了JOIN的不同类型,以及我是否需要UNION,但我有些困惑。我应该如何查询以将Table1 plus Pictures.imagePath的每一行添加到匹配的Table1行(如果存在)上?

谢谢您的时间!!!! :)

编辑已转储的数组输出

    Array
(
    [0] => Array
        (
            [id] => 51
            [0] => 51
            [client] => Test Client
            [1] => Test Client
            [location] => Ayreford House
            [2] => Ayreford House
            [description] => Ceiling cavity of building XYZ
            [3] => Ceiling cavity of building XYZ
            [serial] =>
            [4] => 18001
            [blah] => 123456
            [5] => 123456
            [fw] => Wall
            [6] => Wall
            [pm] => Plasterboard
            [7] => Plasterboard
            [stuff] => ventilation ducting
            [8] => ventilation ducting
            [ref] => S1000-2018
            [9] => S1000-2018
            [otheref] => XTX-1325
            [10] => XTX-1325
            [notes] => Updated photo
            [11] => Updated photo
            [date] => 2018-06-28 21:37:49
            [12] => 2018-06-28 21:37:49
            [picID] => 
            [13] => 
            [imagePath] => 
            [14] => 
            [15] => 
        )

1 个答案:

答案 0 :(得分:1)

之所以这样做,是因为Table1和Pictures都有一个名为serial的列,并且在生成数组键时会删除表名。可能是在内部做这样的事情:

$result = array()
$result[0] = Table1.serial;
$result['serial'] = Table1.serial;
$result[1] = Table1.client;
$result['client'] = Table1.client;
....
$result[14] = Pictures.serial;
$result['serial'] = Pictures.serial;

因此,最终只能使用Picture.serial作为结果数组中键“ serial”的值。

解决此问题的一种方法是显式指定您的列,并且不包括Pictures.serial,如下所示:

SELECT 
  Table1.id,
  Table1.client,
  Table1.location,
  Table1.description,
  Table1.serial, 
  Pictures.notes
FROM
  Table1 
LEFT JOIN 
  Pictures ON Table1.serial = Pictures.serial 
ORDER BY 
  Table1.serial