у меня есть несколько таблиц:
CREATE TABLE IF NOT EXISTS
days(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
active BOOLEAN
);
INSERT into days (name, active) VALUES ('S', True);
INSERT into days (name, active) VALUES ('M', True);
INSERT into days (name, active) VALUES ('T', True);
INSERT into days (name, active) VALUES ('W', True);
INSERT into days (name, active) VALUES ('Th', True);
INSERT into days (name, active) VALUES ('Fr', True);
INSERT into days (name, active) VALUES ('Sut', True);
CREATE TABLE IF NOT EXISTS
user(
id INTEGER PRIMARY KEY AUTOINCREMENT,
mail TEXT,
nickname TEXT,
isadmin INTEGER
);
INSERT into user (nickname, mail) VALUES ('overblown', 'abc@abc.com');
CREATE TABLE IF NOT EXISTS
dish(
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT,
price FLOAT
);
INSERT into dish (name,price) VALUES ('Pizza', 40);
INSERT into dish (name,price) VALUES ('Soup', 20);
INSERT into dish (name,price) VALUES ('Bread', 40);
INSERT into dish (name,price) VALUES ('Chips', 42);
CREATE TABLE IF NOT EXISTS
menu(
id INTEGER PRIMARY KEY AUTOINCREMENT,
dish_id INTEGER,
day_id INTEGER
);
INSERT into menu (dish_id, day_id) VALUES (1, 1);
INSERT into menu (dish_id, day_id) VALUES (2, 1);
INSERT into menu (dish_id, day_id) VALUES (3, 1);
INSERT into menu (dish_id, day_id) VALUES (4, 1);
CREATE TABLE IF NOT EXISTS
request(
id INTEGER PRIMARY KEY AUTOINCREMENT,
menu_id INTEGER,
user_id INTEGER,
count FLOAT
);
INSERT into request (menu_id, user_id, count) VALUES (1, 1, 0.5);
INSERT into request (menu_id, user_id, count) VALUES (2, 1, 0.5);
Я хочу получить все записи из таблицы request
для кого-то пользователя, но также добавить к ним все записи из таблицы menu
для кого-то дня, чтобы результат был уникальным по отношению к menu_id
.
Sqlite не поддерживает RIGHT OUTER JOIN
, и я пытаюсь использовать UNION
:
select user.nickname as nick, dish.name as dish, days.name as day, request.count as size from request
INNER JOIN user on user.id = request.user_id
INNER JOIN menu on menu.id = request.menu_id
INNER JOIN dish on dish.id = menu.dish_id
INNER JOIN days on days.id = menu.day_id
where user_id=1 and days.id=1
UNION
SELECT null as nick, dish.name as dish, days.name as day, 0.0 size from menu
INNER JOIN dish on dish.id = menu.dish_id
INNER JOIN days on days.id = menu.day_id
where menu.day_id=1;
Кажется хорошим, но результат не имеет уникальных значений.
хорошо, я пытаюсь использовать LEFT OUTER JOIN
(с изменением сторон таблицы относительно оператора)
SELECT user.nickname as nick, dish.name as dish, days.name as day, count
FROM menu
LEFT outer JOIN request ON request.menu_id=menu.id
INNER JOIN user on user.id = request.user_id
INNER JOIN dish on dish.id = menu.dish_id
INNER JOIN days on days.id = menu.day_id
where menu.day_id=1 and request.user_id=1
, но результат имеет строки только из request
таблиц и не содержит строк из menu
.
Что я делаю не так?
ожидаемый результат:
('overblown', 'Pizza', 'S', 0.5)
('overblown', 'Soup', 'S', 0.5)
('overblown', 'Bread', 'S', NULL)
('overblown', 'Chips', 'S', NULL)