我尝试使用LEFT JOIN在Postgres中进行选择查询,但我无法获得正确的结果。我有2个表 - offers
和images
,当商品有图片时,它们会被插入表格图片中。但并非所有优惠都有图片。
现在,我想从所搜索的内容中选择所有商品(包括图片和没有图片)以及这些商品是否有图片来展示。我尝试使用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>';
}
答案 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图像。*列的条件,或者它们必须以类似方式处理。