我知道我已经问了这个问题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))
答案 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 ;;错误?没有退货吗?没有返回预期的结果?没有解释你想要做什么..'没有工作'没用。