SQL 涉及聚合函数的查询
SQL Query involving aggregate functions
我在编写此查询时遇到问题。我不知道我是否应该实际使用计数,因为 return 是实际计数,我想 return 没有做过评论的人。无论如何,这是我正在尝试编写的查询。
Find those users that haven’t reviewed any businesses.
我使用的表格是
reviews;
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| business_id | int(11) | NO | PRI | NULL | |
| user_id | int(11) | NO | PRI | NULL | |
| review_id | int(11) | NO | PRI | NULL | |
| review_date | date | YES | | NULL | |
| star_rating | int(1) | YES | | 1 |
businesses
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| business_id | int(11) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(20) | YES | | NULL | |
| full_address | varchar(120) | YES | | NULL | |
users;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| user_since | date | YES | | NULL
这是我目前的情况
SELECT reviews.user_id FROM reviews
JOIN businesses ON (reviews.business_id = businesses.business_id)
GROUP BY reviews.user_id ASC
HAVING COUNT(*) > 0;
这 returns 0 个结果,我认为这是不对的,因为有人可以成为用户而不写评论。但我不知道我还能做什么。谢谢
编辑:我想出了最后一个查询,但现在我正在尝试完成这个查询!
Find the users that have reviewed every business.
您想要用户 table 而不是企业 table。
通过将评论 table 留给用户 table 我们的意思是 - 获取所有用户,如果他们没有留下评论,请将这些列保留为 NULL。然后在 where 子句中,我们只选择那些评论列为空的结果,从而选择没有留下评论的用户。
select u.User_ID
from
users u
left join reviews r
on r.user_id = u.user_id
where r.review_id is null
SELECT u.*
FROM users u
WHERE NOT EXISTS ( SELECT 'a'
FROM reviews r
WHERE r.user_id = u.user_id
)
我在编写此查询时遇到问题。我不知道我是否应该实际使用计数,因为 return 是实际计数,我想 return 没有做过评论的人。无论如何,这是我正在尝试编写的查询。
Find those users that haven’t reviewed any businesses.
我使用的表格是
reviews;
+-------------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+-------+
| business_id | int(11) | NO | PRI | NULL | |
| user_id | int(11) | NO | PRI | NULL | |
| review_id | int(11) | NO | PRI | NULL | |
| review_date | date | YES | | NULL | |
| star_rating | int(1) | YES | | 1 |
businesses
+--------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| business_id | int(11) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| city | varchar(40) | YES | | NULL | |
| state | varchar(20) | YES | | NULL | |
| full_address | varchar(120) | YES | | NULL | |
users;
+------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+-------+
| user_id | int(11) | NO | PRI | NULL | |
| name | varchar(50) | YES | | NULL | |
| user_since | date | YES | | NULL
这是我目前的情况
SELECT reviews.user_id FROM reviews
JOIN businesses ON (reviews.business_id = businesses.business_id)
GROUP BY reviews.user_id ASC
HAVING COUNT(*) > 0;
这 returns 0 个结果,我认为这是不对的,因为有人可以成为用户而不写评论。但我不知道我还能做什么。谢谢
编辑:我想出了最后一个查询,但现在我正在尝试完成这个查询!
Find the users that have reviewed every business.
您想要用户 table 而不是企业 table。
通过将评论 table 留给用户 table 我们的意思是 - 获取所有用户,如果他们没有留下评论,请将这些列保留为 NULL。然后在 where 子句中,我们只选择那些评论列为空的结果,从而选择没有留下评论的用户。
select u.User_ID
from
users u
left join reviews r
on r.user_id = u.user_id
where r.review_id is null
SELECT u.*
FROM users u
WHERE NOT EXISTS ( SELECT 'a'
FROM reviews r
WHERE r.user_id = u.user_id
)