带有多个表的MySQL IFNULL()仍无效

时间:2014-09-23 17:41:53

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

我知道我已经问了这个问题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,所以我尝试使用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))

1 个答案:

答案 0 :(得分:1)

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

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

为什么要订购子查询?

此外,正如我在评论中提到的,如果日期为NULL,则IN如果LHS为NULL,则会返回NULL(条件为假)如果RHS中没有匹配且其中一个值为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

另外请继续展开'不工作&#39 ;;错误?没有退货吗?没有返回预期的结果?没有解释你想要做什么..'没有工作'没用。