【问题标题】:MySQL IFNULL() with multiple tables isn't working具有多个表的 MySQL IFNULL() 不起作用
【发布时间】:2014-11-02 02:00:09
【问题描述】:

我在我的代码中使用了这个查询,但它没有给出结果

$query = sprintf("SELECT s.day, s.hour, h.name hostName
                FROM schedule s, host h
                WHERE dag IN (SELECT day
                                FROM schedule
                                WHERE showId = %s
                                ORDER BY day, hour)
                    AND s.hostId = h.id,
                    AND s.showId = %s
                ORDER BY day, hour",
            mysqli_real_escape_string($con, $id),
            mysqli_real_escape_string($con, $id));

我知道这是因为 s.hostId 可以为 NULL。

我找到了 IFNULL() 方法,并像这样使用它,但是没有用。

SELECT s.day, s.hour, IFNULL(h.name, "") hostname

有人可以帮帮我吗? :S

PS:我知道我可以使用只有 1 个 real_escape 的 sprintf(因为它是相同值的 2 倍),但是如果我将 %s 替换为 %1$s 就像我应该使用占位符一样,我会收到一个错误:S

所以如果有人可以帮助我,也欢迎你:-)

【问题讨论】:

  • 试试IS NULL 而不是ISNULL - ISNULL() 是微软和甲骨文。
  • 对不起,我的意思是 IFNULL 而不是 ISNULL(已编辑)
  • 你在SELECT s.day, s.hour, h.name hostName - SELECT s.day, s.hour, h.name, hostName - 这个FROM schedule s, host h 中是否漏掉了一个逗号,我不确定。不应该有点吗? FROM schedule.s, host.h 似乎不对。
  • 否 @Fred-ii- 我只选择 s.day、s.hour 和 h.name,但我喜欢使用 h.name 作为主机名,所以我没有为该主机名设置别名另一列是别名:-)
  • 列的别名之间不只是一个空格:-)

标签: php sql mysqli mysql-real-escape-string ifnull


【解决方案1】:

您想包含 s.hostId 可以为空的记录吗?如果是这样,那么摆弄字段列表是完全没有意义的。包含/排除行的决定是在WHERE 子句中完成的。

你可能想要

 WHERE ...
     (s.hostId = %s OR ISNULL(s.hostId))

【讨论】:

  • 没有主机名可以为 NULL,所以我在查询中尝试了 IFNULL() 方法,但是没有用...:S
  • 是的,但是有一个空主机名字段不会排除任何记录。在字段列表中执行IFNULL(...) 不能包含/排除任何行。 null hostname 字段意味着一个 null hostid 字段,s.hostID=fooNEVER 返回具有 null hostid 的记录,因为 null 不能等于任何东西,包括它自己。 “null”是有毒的。
  • 如果我使用$query = sprintf("SELECT day, hour, name hostName FROM schedule s, host h WHERE day = (SELECT day FROM schedule WHERE showId = %s ORDER BY dag, uur) AND (h.id = s.hostId OR ISNULL(s.hostId)) AND showId = %s ORDER BY dag, uur", mysqli_real_escape_string($con, $id), mysqli_real_escape_string($con, $id));(就像你建议的那样),它与我在没有AND (h.id = s.hostId OR ISNULL(s.hostId)) 的情况下使用它是一样的,因为你建议的东西会自行中和......:S
【解决方案2】:

你应该为 MySql 使用 IFNULL。 ISNULL 是微软的 sql

IFNULL(h.name, "") 

【讨论】:

  • 对不起,我的意思是 IFNULL 而不是 ISNULL(已编辑)所以我使用了 IFNULL,但不起作用:S
猜你喜欢
  • 1970-01-01
  • 2014-11-18
  • 2015-04-17
  • 2014-07-22
  • 2018-08-23
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多