-1

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

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

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

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

$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))
4

1 回答 1

1

您的查询有点混乱..您要做什么?

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

为什么要订购子查询?

另外,正如我在评论中提到的那样,如果LHS 是或者 RHS 中没有匹配项并且其中一个值是,那么如果 day 是NULL一个IN将返回NULL(条件为 false)。NULLNULL

您还使用了隐式连接,这使得更难判断发生了什么。看起来你想要一个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

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

于 2014-09-23T18:17:53.887 回答