为什么 WHERE 在此 sql 查询中不起作用

Why doesn't the WHERE work in this sql query

我正在编写一个 SQL 查询,它只需要显示 'titel' 与 'Baklava' 相同的结果,但它不会 return任何行。当我尝试使用不带 WHERE 的查询时,会显示所有结果,但我需要 WHERE 子句才能工作。

这是我正在尝试使用的查询:

SELECT *, tags.titel AS tags
FROM posts_tags
INNER JOIN tags ON posts_tags.post_id = tags.id
INNER JOIN posts ON posts.id = tags.id 
WHERE tags.titel = 'Baklava';

import.sql:

CREATE DATABASE foodblog;

USE foodblog;

CREATE TABLE `auteurs` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `auteur` varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO `auteurs` (`id`, `auteur`) VALUES
(1, 'Mounir Toub'),
(2, 'Miljuschka'),
(3, 'Wim Ballieu');

CREATE TABLE `posts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titel` varchar(255) DEFAULT NULL,
  `datum` datetime DEFAULT current_timestamp(),
  `img_url` varchar(255) DEFAULT NULL,
  `inhoud` text DEFAULT NULL,
  `auteur_id` int(11) DEFAULT NULL,
  `likes` int(11) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO `posts` (`id`, `titel`, `datum`, `img_url`, `inhoud`, `auteur_id`, `likes`) VALUES
(1, 'Pindakaas', '2020-06-18 13:25:00', 'https://i.ibb.co/C0Lb7R1/pindakaas.jpg', 'Verwarm de oven voor op 180 °C. Verdeel de pinda’s over een met bakpapier beklede bakplaat en rooster in ca. 8 min. lichtbruin. Schep regelmatig om. Maal de warme pinda’s in de keukenmachine in 4 min. tot een grove, dikke pindakaas. Schep de rand van de kom regelmatig schoon met een spatel. Voeg het zout, de olie en honing toe en maal nog 1 min. tot een gladde pindakaas. Schep in een pot en sluit af.\r\n        variatietip: Houd je van pindakaas met een smaakje? Voeg dan na de honing 1 el sambal badjak, 1 tl gemalen kaneel of 1 el fijngehakte pure chocolade toe. bewaartip: Je kunt de pindakaas 3 weken in de koelkast bewaren.', 1, 13),
(2, 'Baklava', '2020-03-11 10:28:00', 'https://i.ibb.co/ZWVRdPT/baklava.jpg', 'Voorbereiding\r\n\r\n    Verwarm de oven voor op 190 °C. Vet de bakvorm in met roomboter.\r\n    Smelt de roomboter in een pannetje. Snijd het baklavadeeg op dezelfde breedte als de bakvorm en bewaar het in een schone droge keukendoek om uitdrogen te voorkomen. Verwarm in een pan 300 gr honing met 20 ml oranjebloesemwater en houd dit mengsel warm. Roer in een mengkom de gezouten roomboter, 500 g gemalen walnoten, de rest van de honing en het oranjebloesemwater en de kaneel door elkaar. Verdeel het mengsel in zeven gelijke porties (van circa 90 g).\r\n\r\n    Bereiding\r\n    Bestrijk een vel baklavadeeg met gesmolten roomboter. Leg er een tweede vel op en bestrijk dat ook. Neem één portie van het walnotenmengsel en verdeel dat onderaan over het baklavadeeg. Rol op tot een staaf, leg deze in de bakvorm en bestrijk met gesmolten roomboter. Maak de rest van de staven op dezelfde manier.\r\n    Snijd elke staaf met een scherp mes meteen in zessen. Bak de baklava in circa 25 minuten goudbruin en krokant in de oven.\r\n    Neem de bakvorm uit de oven en verdeel de warme honing over de baklava. Garneer meteen met de rest van de fijngemalen walnoten. Laat de baklava minimaal 3 uur afkoelen voordat je ervan gaat genieten.', 3, 7);

CREATE TABLE `posts_tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `post_id` int(11) DEFAULT NULL,
  `tag_id` int(11) DEFAULT NULL,
  PRIMARY KEY (id)
);

CREATE TABLE `tags` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `titel` varchar(255) DEFAULT NULL,
  PRIMARY KEY (id)
);

INSERT INTO tags (id, titel)
VALUES (1, 'Baklava');

INSERT INTO posts_tags (id, post_id, tag_id)
VALUES (1, 2, 1);

ALTER TABLE `posts`
  ADD KEY `auteur_id` (`auteur_id`);

--
-- Indexen voor tabel `posts_tags`
--
ALTER TABLE `posts_tags`
  ADD KEY `post_id` (`post_id`),
  ADD KEY `tag_id` (`tag_id`);

ALTER TABLE `posts`
  ADD CONSTRAINT `posts_ibfk_1` FOREIGN KEY (`auteur_id`) REFERENCES `auteurs` (`id`);

ALTER TABLE `posts_tags`
  ADD CONSTRAINT `posts_tags_ibfk_1` FOREIGN KEY (`post_id`) REFERENCES `posts` (`id`),
  ADD CONSTRAINT `posts_tags_ibfk_2` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`);
COMMIT;

您尚未在 posts_tags table 中插入任何行,因此 poststags 之间没有 link。

尝试:

INSERT INTO `posts_tags` (`post_id`, `tag_id`) VALUES (2,1);

您的查询也有错误:

SELECT *, tags.titel AS tags
FROM posts_tags
INNER JOIN tags ON posts_tags.post_id = tags.id <<< ????
INNER JOIN posts ON posts.id = tags.id <<< ???
WHERE tags.titel = 'Baklava';

应该是

SELECT *, tags.titel AS tags
FROM posts_tags
INNER JOIN tags ON posts_tags.tag_id = tags.id
INNER JOIN posts ON posts_tags.post_id = posts.id 
WHERE tags.titel = 'Baklava';

然后运行再次查询。

我还建议您更改 posts_tags table,删除不需要的 id 字段,并且在没有对其他字段进行唯一约束的情况下,您最终会得到多次添加到同一个 post 的标签。改为创建复合主键:

CREATE TABLE `posts_tags` (
  `post_id` int(11) DEFAULT NULL,
  `tag_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`post_id`, `tag_id`)
);

您的陈述中存在三个问题。第一个是你的 posts_tags table 是空的,所以 INNER JOIN 产生一个空的结果集。

第二个是INSERT语句中错误的填充了tagstable,所以这个也是空的

而第三个问题似乎是你加入的栏目在逻辑上似乎不正确。

尝试将以下内容添加到您的 import.sql

INSERT INTO posts_tags VALUES (1, 2, 1)

并修复另一个 INSERT 语句:

INSERT INTO tags VALUES (1, 'Baklava')

数据现在正确地表明 post 2 与标签 1 相关。

然后修改您的 ON 子句,使它们有意义:

SELECT *, tags.titel AS tags
FROM posts_tags
INNER JOIN tags ON posts_tags.tag_id = tags.id
INNER JOIN posts ON posts.id = posts_tags.post_id 
WHERE tags.titel = 'Baklava'

这会产生您想要的结果。

this db<>fiddle