Я знаю, я уже задавал этот вопрос Вот но у меня не было хорошего ответа, поэтому я попробую еще раз, и на этот раз я надеюсь, что смогу дать вам достаточно информации, ребята.
Прежде чем задать свой вопрос, я покажу вам, как я создал (полезную часть) свою базу данных:
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 () — метода MySQL:
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))
Ваш запрос немного беспорядок .. что вы пытаетесь сделать?
Ваш подзапрос выбирает день из расписания, где showId — переданная переменная, и сравнивает его со днем другого расписания, отфильтрованного по тому же showId. Это бессмысленно.
Почему вы заказали подзапрос?
Кроме того, как я уже упоминал в комментариях, если день когда-либо NULL
IN
вернусь NULL
(false для условия), если LHS 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
Также, пожалуйста, укажите «не работает»; Ошибки? Ничего не возвращает? Не возвращает ожидаемых результатов? Без объяснения того, что вы пытаетесь сделать, «не работает» бесполезно.
Других решений пока нет …