我正在尝试使用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>';
}
由于WHERE子句中的这种情况,这不能工作:
images.file_type = 3
对于在LEFT JOIN右侧不匹配的行,SQL引擎会将NULL放入与右侧表相对应的所有列中。然后,条件images.file_type = 3
被评估为false,images.file_type
NULL被评估。因此,消除了没有图像的行。
实际上,此条件取消了LEFT JOIN的作用,使其等效于INNER JOIN(与单独的JOIN相同)
您可以通过file_type
在LEFT JOIN之前应用限制来解决此问题,如下所示:
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 image。*列的条件,否则必须类似地对其进行处理。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句