By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TABLE SONG (`id` INTEGER, `title` VARCHAR(8));
INSERT INTO SONG (`id`, `title`) VALUES
('1', 'song #1'),
('2', 'song #2');
CREATE TABLE FEATURE (`id` INTEGER, `name` VARCHAR(5), `value` VARCHAR(8));
INSERT INTO FEATURE (`id`, `name`, `value`) VALUES
('1', 'mood', 'sad'),
('2', 'mood', 'happy'),
('3', 'mood', 'euphoric'),
('4', 'style', 'rock'),
('5', 'style', 'jazz');
CREATE TABLE SONG_FEATURE (`song_id` INTEGER, `feature_id` INTEGER);
INSERT INTO SONG_FEATURE (`song_id`, `feature_id`) VALUES
('1', '1'),
('2', '1'),
('2', '2');
SELECT s.id, s.title
FROM SONG s
INNER JOIN SONG_FEATURE sf ON sf.song_id = s.id
INNER JOIN FEATURE f ON f.id = sf.feature_id
WHERE (f.name, f.value) IN (('mood', 'sad'), ('mood', 'happy'))
GROUP BY s.id, s.title
HAVING COUNT(DISTINCT f.name, f.value) = 2
id | title |
---|---|
2 | song #2 |