【问题标题】:mysql query not returning result if data is not in table如果数据不在表中,mysql查询不返回结果
【发布时间】:2013-04-10 06:41:34
【问题描述】:

这是几乎可以工作的查询:

$query  = '';
$query .= ' SELECT highway_code.charge_id, 
        highway_code.act_abbr, 
        highway_code.short_form_wording, 
        highway_code.section, 
        highway_code.set_fine,  
        highway_code_arrest_jail_tow.demerits
        ';
$query .= ' FROM highway_code, highway_code_arrest_jail_tow ';
$query .= ' WHERE highway_code.charge_id = ? ';
$query .= ' AND highway_code.section = highway_code_arrest_jail_tow.section ';
$query .= ' AND highway_code.act_abbr = highway_code_arrest_jail_tow.act_abbr ';

问题在于,并非所有高速公路代码收费都有记过,因此即使所有其他字段都适用,任何没有记过的费用都不会被退回。无论highway_code_arrest_jail_tow 中是否有值,我都希望退回所有费用。

【问题讨论】:

  • 您需要一个LEFT JOIN 而不是这里的隐式INNER JOIN(通过逗号分隔的表名)查看codinghorror.com/blog/2007/10/…
  • 感谢您的链接。我认为这是我在这个话题上看到的最好的解释。但是,作为一个在创建 SQL 语句方面经验有限的新手,我不确定我会如何写出来......我现在开始做研究,但是如果解决方案很简单,你介意发布吗?谢了!

标签: php select mysqli


【解决方案1】:

FROM 子句中使用逗号分隔表,相关列之间的相等条件意味着INNER JOIN。要强制从主表返回所有记录,而不管相关表中是否存在相关记录,请改用LEFT JOIN

我将用显式 LEFT JOIN 替换您的隐式内部连接:

SELECT
  highway_code.charge_id, 
  highway_code.act_abbr, 
  highway_code.short_form_wording, 
  highway_code.section, 
  highway_code.set_fine,  
  highway_code_arrest_jail_tow.demerits
FROM
  highway_code
  LEFT JOIN highway_code_arrest_jail_tow
     /* Two relating conditions belong in the ON clause */
     ON highway_code.section = highway_code_arrest_jail_tow.section
     AND highway_code.act_abbr = highway_code_arrest_jail_tow.act_abbr
WHERE
  /* and the filtering condition remains in the WHERE */
  highway_code.charge_id = ?

【讨论】:

  • 你先生,太棒了。我是如此接近,这是我在玩杂耍的最后的地方。非常感谢迈克尔。
猜你喜欢
  • 1970-01-01
  • 2016-09-03
  • 1970-01-01
  • 2023-02-09
  • 1970-01-01
  • 2021-11-27
  • 2015-01-29
  • 2017-05-18
  • 2023-03-08
相关资源
最近更新 更多