Итак, у меня есть эта две таблицы, где он записывает, какая пища является фаворитом пользователя:
таблица users
------------
id | country
------------
1 | US
2 | PH
3 | US
4 | US
5 | PH
таблица food_favourites
-----------------
food_id | user_id
-----------------
3 | 1
7 | 1
3 | 2
3 | 3
3 | 4
Я хочу знать, сколько уникальных пользователей из США отметили food_id 3 в качестве своего любимого.
Пока у меня есть этот запрос:
select *, count(user_id) as total
from food_favourite
inner join users on users.id = food_favourites.user_id
where food_favourites.food_id = 3
and users.country = 'US'
group by users.id
Ну, это не работает, он возвращает total
4, а не 3.
Я также пытался делать подзапросы - не повезло, я думаю, что что-то упускаю.
DROP TABLE IF EXISTS users;
CREATE TABLE users
(user_id SERIAL PRIMARY KEY
,country CHAR(2) NOT NULL
);
INSERT INTO users VALUES
(1,'US'),
(2,'EU'),
(3,'US'),
(4,'US'),
(5,'EU');
DROP TABLE IF EXISTS favourite_foods;
CREATE TABLE favourite_foods
(food_id INT NOT NULL
,user_id INT NOT NULL
,PRIMARY KEY(food_id,user_id)
);
INSERT INTO favourite_foods VALUES
(3,1),
(7,1),
(3,2),
(3,3),
(3,4);
SELECT COUNT(DISTINCT u.user_id) distinct_users
FROM users u
JOIN favourite_foods f
ON f.user_id = u.user_id
WHERE u.country = 'US'
AND f.food_id = 3;
+----------------+
| distinct_users |
+----------------+
| 3 |
+----------------+
Я хочу знать, сколько уникальных пользователей из США отметили food_id 3 в качестве своего любимого.
Вы считаете уникальные значения с помощью COUNT DISTINCT
:
select count(distinct ff.user_id) as total
from food_favourite ff
inner join users u on u.id = ff.user_id
where ff.food_id = 3
and u.country = 'US';
Не группируйте по пользователю, потому что вам не нужен результат для каждого пользователя. Вы хотите один ряд с одним номером, рассказывая, сколько американцев предпочитают пищу 3.
Альтернатива, которую я предпочитаю за соединение. Запрос читается так, как я бы сформулировал задачу: подсчитайте пользователей из США, которые любят пищу 3.
select count(*) as total
from users
where country = 'US'
and id in (select user_id from food_favourites where food_id = 3);
Нет ненужного соединения и, следовательно, нет необходимости возвращаться к отдельным значениям.
Прежде всего, ответ на вышеупомянутый вопрос должен быть 3, так как id 1,3,4 все имеют food_id 3 как их любимую пищу.
Чтобы просто распечатать запрос, попробуйте это, это, безусловно, будет работать:
select count(*) as total from food_favourites
inner join users on users.id=food_favourites.user_id
where food_id=3 and country='US';
Sub_query - это
SELECT u.country, f.food_id, COUNT(u.id) AS 'Total users'
FROM users u
INNER JOIN food_favourites AS f ON (u.id = f.[user_id])
WHERE u.country = 'US'
GROUP BY u.country, f.food_id
select count(user_id) as total, Country
from food_favourites
inner join users on users.id = food_favourites.user_id
where food_favourites.food_id = 3
and users.country = 'US'
group by country
Непроверенный, но я думаю, что это то, что вам нужно? Это вернет результаты только для США и идентификатор питания 3. Если вам нужно что-то более многоразовое, вы можете просто пропустить результаты для ВСЕХ стран... что-то вроде этого должно работать (еще раз, непроверено...):
select count(user_id) as total, Country, food_id
from food_favourites
inner join users on users.id = food_favourites.user_id
group by country, food_id
order by country, food_id
Пытаться:
select count(user_id) as total
from food_favourites
inner join users on users.id = food_favourites.user_id
where food_favourites.food_id = 3
and users.country = 'US'