【问题标题】:MySQL IFNULL() with multiple tables still isn't working [closed]具有多个表的 MySQL IFNULL() 仍然无法正常工作[关闭]
【发布时间】:2014-11-18 00:46:39
【问题描述】:

我知道我已经问过这个问题here,但没有得到好的答案,所以我再试一次,这次我希望我能为你们提供足够的信息。

在我提出问题之前,我将向您展示我是如何创建(有用的部分)我的数据库的:

CREATE TABLE host(
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        naam VARCHAR(40) NOT NULL,
        isActief BOOLEAN NOT NULL DEFAULT TRUE,

        UNIQUE unq_host_naam(naam)
);


CREATE TABLE shows(
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        naam VARCHAR(30) NOT NULL,
        facebook VARCHAR(50) DEFAULT NULL,
        twitter VARCHAR(50) DEFAULT NULL,
        isNonStop BOOLEAN NOT NULL DEFAULT FALSE,
        showProgrammaInMenu BOOLEAN NOT NULL DEFAULT TRUE,
        isActief BOOLEAN NOT NULL DEFAULT TRUE,

        UNIQUE unq_shows_naam(naam)
);


/* The following tables (day and hour) were created because MySQL doesn't have CHECK-constraints*/
CREATE TABLE day( id INT NOT NULL PRIMARY KEY );
INSERT INTO day
        VALUES (1), (2), (3), (4), (5), (6), (7);
CREATE TABLE hour( id INT NOT NULL PRIMARY KEY );
INSERT INTO hour
        VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12), (13), (14), (15), (16), (17), (18), (19), (20), (21), (22), (23);


CREATE TABLE schedule(
        id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
        dag INT NOT NULL,
        uur INT NOT NULL,
        showId INT,
        hostId INT,

        FOREIGN KEY fk_schedule_day(dag) REFERENCES day(id),
        FOREIGN KEY fk_schedule_hour(uur) REFERENCES hour(id),
        FOREIGN KEY fk_schedule_shows(showId) REFERENCES shows(id),
        FOREIGN KEY fk_schedule_host(hostId) REFERENCES host(id),

        UNIQUE unq_schedule_dag_uur(dag, uur)
);

我正在尝试运行此查询:

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

我知道它不起作用,因为 hostId 可以为 NULL,所以我尝试使用 MySQL 的 IFNULL() 方法修复它:

SELECT s.dag, s.uur, IFNULL(h.naam, "") hostname

但这没有用。 此外,here 提到的选项也不起作用,因为它只会自我中和......

$query = sprintf("SELECT s.dag, s.uur, h.naam hostName
                FROM schedule s, host h
                WHERE dag IN (SELECT dag
                                FROM schedule
                                WHERE showId = %s)
                    AND (s.hostId = h.id OR ISNULL(s.hostId))
                    AND s.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))

【问题讨论】:

  • 请设置一个 SQL fiddle。
  • 有没有一天NULL?如果未找到匹配项,则子选择中的任何 NULL 都会导致 in 返回 NULL
  • 我认为mysql没有ISNULL函数。它应该是 s.hostId IS NULL。
  • “不工作”“不工作”不是行为的明确声明你在观察。错误信息?返回的行数不够?行太多,或返回错误的行?您要达到什么结果集?这里的一些好人会给你一些建议,但没有人能够回答你的问题,因为你还没有提出任何问题。
  • @JayBlanchard:SQLfiddle.com 目前不工作:S

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


【解决方案1】:

你的查询有点乱..你想做什么?

您的子查询从时间表中选择日期,其中 showId 是传入的变量,并将其与由相同 showId 过滤的另一个时间表的日期进行比较。这是没有意义的。

为什么要订购子查询?

另外,正如我在 cmets 中提到的,如果一天是 NULL,如果 LHS 是 NULL 或 RHS 中没有匹配项,IN 将返回 NULL(条件为假)其中一个值为NULL

您还使用了隐式连接,这使得更难判断发生了什么。看起来您想要一个 LEFT JOIN,以便在没有主持人的情况下返回日程安排。

您似乎已尝试编写以下逻辑等价物:

   SELECT s.day, s.hour, COALESCE(h.name,'') hostName
     FROM schedule s
LEFT JOIN host h
       ON h.id = s.hostId
    WHERE s.showId = %s
 ORDER BY s.day, s.hour

还请扩展“不起作用”;错误?什么都不回?不返回预期结果?如果不解释您要做什么..“不起作用”是没用的。

【讨论】:

  • +1。 @Arth:正如你所指出的,我们只是在猜测 OP 试图实现什么,他正在观察什么行为,以及这与他期望返回的结果有何不同。
  • 就像我发布的here:如果我有一个没有主持人的节目,我的查询不会给我任何行。但是感谢您的帮助! LEFT JOIN为我工作!也许是因为我使用了逻辑等价物?
  • 酷,很高兴它成功了!这可能与 IN 条件未按预期运行有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-02
  • 1970-01-01
  • 2013-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多