2015-03-16 2 views
-1

Я не могу понять, как записать эти 2 запроса в созданных таблицах. Эти два запроса, которые я пытаюсь написать вНаписание SQL-запроса, который получает информацию из трех разных таблиц

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 |  | 

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

EDIT: То, что я пытался

Для первого запроса: Найти пользователей, которые оставили отзывы как магазины и рестораны.

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; 
+2

Идите первым. В вашем учебном пособии/учебнике рассказывается, с чего начать. –

+0

http://www.sitepoint.com/understanding-sql-joins-mysql-database/ – BK435

+0

Im пытается в моем sql, и я продолжаю получать ошибки –

ответ

0

Вот что должно выглядеть в первую очередь: вы можете изменить оператор выбора на основе информации, которую хотите увидеть.

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) 

В основном это тянет все пользователи, которые писали отзывы, где business_id находится в таблице is_a_shop или is_a_restaurant. вы должны иметь возможность легко определить второй запрос.

0

Как и большинство SQL, эти запросы могут быть решены несколькими способами. Эти решения должны быть довольно легко понять:

Найти пользователей, которые просмотрели как магазины, так и рестораны.

-- 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 
    ) 
Смежные вопросы