Postgres中的LEFT JOIN查询

时间:2015-12-28 19:56:19

标签: sql postgresql select join

我尝试使用LEFT JOIN在Postgres中进行选择查询,但我无法获得正确的结果。我有2个表 - offersimages,当商品有图片时,它们会被插入表格图片中。但并非所有优惠都有图片。

现在,我想从所搜索的内容中选择所有商品(包括图片和没有图片)以及这些商品是否有图片来展示。我尝试使用LEFT JOIN从images中选择是否有图像,但是当我试图显示它们时,会有NULL值 - 没有任何返回值。

我的查询有什么问题?

$sql->query("SELECT count(offers.id) as offers_count FROM offers LEFT JOIN images ON images.offer_id = offers.id AND images.file_type = 3 WHERE $where"); //$where is what is searched from user


$SQL = "SELECT  images.filename, * FROM offers LEFT JOIN images ON images.offer_id = offers.id AND images.file_type = 3 WHERE  $where $result LIMIT 12 OFFSET ".($page-1)*12);

for ($i=0; $i<$sql->getNumRows(); $i++) {
$obj = $sql->getRow($i);
offers::show_offer($obj); 
}

function show_offer($offer_obj) {
$img = $offer_obj['filename']; 
$picture = '<img src="/'.$img.'"  />';
echo '<div>';
echo $picture; 
//some other info I show
echo '</div>';

}

1 个答案:

答案 0 :(得分:1)

由于WHERE子句中的这种情况,它无法工作:

images.file_type = 3

对于在LEFT JOIN右侧不匹配的行,SQL引擎会将NULL放入与右侧表对应的所有列中。然后,条件images.file_type = 3被评估为false,因为images.file_type为NULL。所以没有图像的行被消除了。

实际上,这个条件取消了LEFT JOIN的效果,使其相当于INNER JOIN(与JOIN相同)

您可以通过在LEFT JOIN之前对file_type应用限制来解决此问题,如下所示:

SELECT i.somecolumn, offers.* FROM
    offers
 LEFT JOIN
   (select * from images WHERE file_type=3) AS i
 ON i.offer_id = offers.id 
 WHERE  $where ...

确保$where中的其他子句也不是ON图像。*列的条件,或者它们必须以类似方式处理。