【发布时间】: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