Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 编写从3个不同表获取信息的SQL查询_Mysql_Sql_Database - Fatal编程技术网

Mysql 编写从3个不同表获取信息的SQL查询

Mysql 编写从3个不同表获取信息的SQL查询,mysql,sql,database,Mysql,Sql,Database,我似乎不知道如何在我创建的表上编写这两个查询。我想写的两个问题是 Find users that have reviewed both shops and restaurants. Find users that reviewed businesses, but not shops or restaurants. 我正在使用的表格是 reviews; +-------------+---------+------+-----+---------+-------+ | Field

我似乎不知道如何在我创建的表上编写这两个查询。我想写的两个问题是

Find users that have reviewed both shops and restaurants.

Find users that reviewed businesses, but not shops or restaurants.
我正在使用的表格是

 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



explain is_a_restaurant;
 +--------------+-------------+------+-----+---------+-------+
 | Field        | Type        | Null | Key | Default | Extra |   
+--------------+-------------+------+-----+---------+-------+
| business_id  | int(11)     | NO   | PRI | NULL    |       |
| cuisine_type | varchar(20) | YES  |     | NULL    |       |
| total_seats  | int(11)     | YES  |     | 1       |       |
+--------------+-------------+------+-----+---------+-------+

explain is_a_shop;
 +-------------+-------------+------+-----+---------+-------+
 | Field       | Type        | Null | Key | Default | Extra |
 +-------------+-------------+------+-----+---------+-------+
 | business_id | int(11)     | NO   | PRI | NULL    |       |
 | shop_type   | varchar(50) | YES  |     | NULL    |       |
我真的不知道从哪里开始。我知道我将用商业ID加入企业,但我不知道如何才能找到对商店和餐馆进行审查的人。有人能帮忙吗

编辑:我已经试过了

对于第一个查询:查找同时查看过商店和餐馆的用户

 SELECT b.business_id
 FROM is_a_shop b 
 JOIN reviews r
 ON r.business_id = b.business_id
 JOIN is_a_restaurant k
 ON r.business_id = k.business_id;
-- solution 1 - using joins:
select u.name 
from users u
join (
    select r.user_id 
    from reviews r 
    join is_a_restaurant i on i.business_id = r.business_id 
) resturant_reviews on u.user_id = resturant_reviews.user_id
join ( 
    select r.user_id 
    from reviews r 
    join is_a_shop i on i.business_id = r.business_id 
) shop_reviews on u.user_id = shop_reviews.user_id

-- solution 2: using exists - probably faster than solution 1
select u.name 
from users u
join reviews r on u.user_id = r.user_id
where exists (
    select 1 from is_a_restaurant i 
    where i.business_id = r.business_id 
) and exists (
    select 1 from is_a_shop i 
    where i.business_id = r.business_id 
)
-- solution 1: using not in - probably faster than solution 2
select u.name from users u
join reviews r on u.user_id = r.user_id
where r.business_id not in 
    (
    select business_id from is_a_restaurant
    union all 
    select business_id from is_a_shop
    )

-- solution 2: using exists
select u.name from users u
join reviews r on u.user_id = r.user_id
where not exists (
    select business_id from is_a_restaurant 
    where r.business_id = business_id
    )
and not exists (
    select business_id from is_a_shop 
    where r.business_id = business_id
    )

第一个语句应该是这样的:您可以根据希望看到的信息更改select语句

SELECT u.name
FROM users u
INNER JOIN reviews rev ON rev.user_id = u.user_ID

WHERE EXISTS
(SELECT *
FROM is_a_shop s
WHERE s.business_id = rev.business_id)

OR EXISTS
(SELECT *
FROM is_a_restaurant r
WHERE r.business_id = rev.business_id)

这基本上吸引了所有写评论的用户,他们的商业id在is_a_shop表或is_a_餐厅中。您应该能够很容易地从中找出第二个查询。

与大多数SQL一样,这些查询可以通过多种不同的方式解决。这些解决方案应该很容易理解:

查找同时查看过商店和餐厅的用户

 SELECT b.business_id
 FROM is_a_shop b 
 JOIN reviews r
 ON r.business_id = b.business_id
 JOIN is_a_restaurant k
 ON r.business_id = k.business_id;
-- solution 1 - using joins:
select u.name 
from users u
join (
    select r.user_id 
    from reviews r 
    join is_a_restaurant i on i.business_id = r.business_id 
) resturant_reviews on u.user_id = resturant_reviews.user_id
join ( 
    select r.user_id 
    from reviews r 
    join is_a_shop i on i.business_id = r.business_id 
) shop_reviews on u.user_id = shop_reviews.user_id

-- solution 2: using exists - probably faster than solution 1
select u.name 
from users u
join reviews r on u.user_id = r.user_id
where exists (
    select 1 from is_a_restaurant i 
    where i.business_id = r.business_id 
) and exists (
    select 1 from is_a_shop i 
    where i.business_id = r.business_id 
)
-- solution 1: using not in - probably faster than solution 2
select u.name from users u
join reviews r on u.user_id = r.user_id
where r.business_id not in 
    (
    select business_id from is_a_restaurant
    union all 
    select business_id from is_a_shop
    )

-- solution 2: using exists
select u.name from users u
join reviews r on u.user_id = r.user_id
where not exists (
    select business_id from is_a_restaurant 
    where r.business_id = business_id
    )
and not exists (
    select business_id from is_a_shop 
    where r.business_id = business_id
    )
查找浏览过企业而不是商店或餐馆的用户

 SELECT b.business_id
 FROM is_a_shop b 
 JOIN reviews r
 ON r.business_id = b.business_id
 JOIN is_a_restaurant k
 ON r.business_id = k.business_id;
-- solution 1 - using joins:
select u.name 
from users u
join (
    select r.user_id 
    from reviews r 
    join is_a_restaurant i on i.business_id = r.business_id 
) resturant_reviews on u.user_id = resturant_reviews.user_id
join ( 
    select r.user_id 
    from reviews r 
    join is_a_shop i on i.business_id = r.business_id 
) shop_reviews on u.user_id = shop_reviews.user_id

-- solution 2: using exists - probably faster than solution 1
select u.name 
from users u
join reviews r on u.user_id = r.user_id
where exists (
    select 1 from is_a_restaurant i 
    where i.business_id = r.business_id 
) and exists (
    select 1 from is_a_shop i 
    where i.business_id = r.business_id 
)
-- solution 1: using not in - probably faster than solution 2
select u.name from users u
join reviews r on u.user_id = r.user_id
where r.business_id not in 
    (
    select business_id from is_a_restaurant
    union all 
    select business_id from is_a_shop
    )

-- solution 2: using exists
select u.name from users u
join reviews r on u.user_id = r.user_id
where not exists (
    select business_id from is_a_restaurant 
    where r.business_id = business_id
    )
and not exists (
    select business_id from is_a_shop 
    where r.business_id = business_id
    )

先走一步。你的课件/教科书会告诉你从哪里开始。我正在尝试我的sql,但我不断出错。我不明白如何处理另外两个表(is a__shop和另一个)你如何存储评论?