i have some tables:
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);
I want to get all the records from the request
table for the someone user, but also add to them all the records from the menu
table for a someone day, so that the result would be unique relative to the menu_id
.
Sqlite dont support RIGHT OUTER JOIN
, and i trying use 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;
Seems like good, but result has not unique values.
okey, i try used LEFT OUTER JOIN
(with changing the sides of the table relative to the operator)
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
but result has row only from request
tables, and not containt rows from menu
.
What i does wrong?
expected result:
('overblown', 'Pizza', 'S', 0.5)
('overblown', 'Soup', 'S', 0.5)
('overblown', 'Bread', 'S', NULL)
('overblown', 'Chips', 'S', NULL)