Граф с Join в MySQL

0

Итак, у меня есть эта две таблицы, где он записывает, какая пища является фаворитом пользователя:

таблица 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.

Я также пытался делать подзапросы - не повезло, я думаю, что что-то упускаю.

  • 2
    Вот подсказка: «*» никогда не будет частью ответа.
  • 2
    А какая страна является «ЕС»?
Показать ещё 4 комментария
Теги:

6 ответов

2
Лучший ответ
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 |
+----------------+
  • 0
    О боже, я совсем забыла о отличном! Спасибо! Это работает. PS некоторые поля неправильны, как u.user_id ... но на самом деле это не имеет большого значения, так как мы оба понимаем, как это должно быть. :)
  • 0
    Это псевдоним таблицы. В основном это ярлык, чтобы не вводить полное имя таблицы каждый раз.
Показать ещё 4 комментария
1

Я хочу знать, сколько уникальных пользователей из США отметили 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);

Нет ненужного соединения и, следовательно, нет необходимости возвращаться к отдельным значениям.

1

Прежде всего, ответ на вышеупомянутый вопрос должен быть 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';
  • 0
    Привет, я думаю, что это вернет 4, так как это не сгруппировано по user_id и данные имеют два "1" user_id. И кажется, что добавление group by делает результат "1" или "2", потому что он считается за группу. Спасибо за помощь, кстати
  • 0
    Это обязательно вернется 3
Показать ещё 1 комментарий
0

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
0
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
  • 0
    Привет, извините, но нет. Я пытаюсь получить общее количество всех пользователей (уникальных), которые отметили определенную еду в таблице food_favourites и которые проживают в США.
  • 0
    Я внес некоторые изменения в это мгновение назад, которые теперь должны соответствовать тому, что вы ищете.
Показать ещё 2 комментария
0

Пытаться:

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'
  • 0
    Это вернет 4 вместо 2, потому что это не сгруппировано по user_id.
  • 0
    Нет, он вернет синтаксическую ошибку, как и ваша оригинальная версия, потому что «таблица» является ключевым словом. Удалите слово «таблица» и оно вернет 3 записи
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню