【问题标题】:LEFT JOIN query in PostgresPostgres 中的 LEFT JOIN 查询
【发布时间】:2016-04-02 16:15:30
【问题描述】:

我正在尝试使用 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>';

}

【问题讨论】:

  • 我把它运行到 Postgre 客户端,但我找不到问题出在哪里。当没有图像时,它为 NULL,但不显示此图像,此报价的全部信息不显示甚至没有身份证。
  • @a_horse_with_no_name: select table1.col1, * works in Postgres。我相信这是 Oracle 的错误,你是这个意思吗?
  • 如果您没有收到错误,但结果为空,您需要向我们展示您正在执行的 real 查询,而不是 PHP(?) 代码。如果您没有得到空结果而是错误的结果,请编辑您的问题添加一些示例数据(最好是insert into)语句和您得到的结果(如格式化 text) 包括执行的 real 语句。

标签: sql postgresql select join


【解决方案1】:

由于 WHERE 子句中的这种情况,这不起作用:

images.file_type = 3

对于 LEFT JOIN 右侧不匹配的行,SQL 引擎会将 NULL 放入与右侧表对应的所有列中。然后,条件images.file_type = 3 被评估为假,因为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 images.* 列,否则必须进行类似处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2015-02-22
    • 2021-01-28
    • 2012-09-05
    • 1970-01-01
    相关资源
    最近更新 更多