我正在撰寫一個 SQL 查詢,它只需要顯示“標題”與“果仁蜜餅”相同的結果,但它不回傳任何行。當我嘗試使用沒有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';
匯入.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;
uj5u.com熱心網友回復:
您尚未在posts_tags表中插入任何行,因此posts和之間沒有鏈接tags。
嘗試:
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表格,洗掉id不需要的欄位,并且對其他欄位沒有唯一約束,您最終可能會在同一帖子中多次添加標簽。改為創建復合主鍵:
CREATE TABLE `posts_tags` (
`post_id` int(11) DEFAULT NULL,
`tag_id` int(11) DEFAULT NULL,
PRIMARY KEY (`post_id`, `tag_id`)
);
uj5u.com熱心網友回復:
你的陳述中有三個問題。第一個是你的posts_tags表是空的,所以 anINNER JOIN產生一個空的結果集。
第二個是填表的INSERT陳述句有錯誤tags,所以這也是空的。
第三個問題似乎是您加入的列在邏輯上似乎不正確。
嘗試將以下內容添加到您的import.sql:
INSERT INTO posts_tags VALUES (1, 2, 1)
并修復另一個INSERT陳述句:
INSERT INTO tags VALUES (1, 'Baklava')
資料現在正確地表明 post2與 tag 相關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'
這會產生您想要的結果。
看到這個 db<>fiddle
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/351136.html
下一篇:從多個子查詢派生欄位
