2016-01-30 5 views
1

я создал три таблицы таким образом, чтоSQL запрос, чтобы найти средние

CREATE TABLE guest(

name varchar(100), 
ranking int, 
PRIMARY KEY (name) 
); 

CREATE TABLE room(

roomname varchar(100), 
wallcolor varchar(100), 
rating int, 
PRIMARY KEY(roomnane) 
); 

CREATE TABLE reservation(

name varchar(100), 
roomname varchar(100), 
day varchar(100), 
moveinday int, 
moveoutday int, 
PRIMARY KEY(roomname, day, start, finish), 
    FOREIGN KEY(roomname) REFERENCES room(roomname), 
    FOREIGN KEY(name) REFERENCES guest(name) 
); 

Я пытаюсь создать два запроса

  1. Для каждого заказанного номера, перечислите средний рейтинг гостей, имеющих защищены эта комната. У меня возникли проблемы с перечислением среднего значения для каждой комнаты. Вот что я пытался

    select reservation.roomname, AVG(guest.ranking) 
    from reservation, room, guest 
    where reservation.roomname == room.roomname AND reservation.name = guest.name 
    

Это не дает желаемого результата. Как я могу исправить свой запрос?

  1. Запрос, чтобы проверить, нет ли противоречивых резерваций для комнат. (Тот же номер не может быть зарезервирован для множества людей старше moveinday и moveoutday Я не знаю, как начать для этого
+1

Почему вы храните информацию о типе даты как varchar (100) и moveinday и moveoutday как целые числа? – jpw

+0

У вас будет действительно страшное время, пытаясь управлять датой и временем, если вы используете varchars и целые числа. Система бронирования номеров должна использовать даты, которые являются основными для цели бронирования. Я также предлагаю вам иметь таблицу целых чисел (иногда называемую «таблицей таблицы»), которая очень полезна для вашего запроса 2 –

+0

и почему рейтинг гостей не в таблице бронирования? что произойдет, если один и тот же гость останется не раз, в разных комнатах, и хочет ранжировать каждого? Является ли этот вопрос домашним заданием? –

ответ

2

Dont забыть о GROUP BY:.

SELECT reservation.roomname, AVG(guest.ranking) 
FROM reservation, room, guest 
WHERE reservation.roomname = room.roomname 
AND reservation.name = guest.name 
GROUP BY reservation.roomname 
+1

SQL не использует '==' для равенства; также, почему бы не использовать надлежащие явные соединения SQL-92? – jpw

+0

Хорошо, отредактировано, было compy-paste – mnv

1

Вы должны научиться использовать правильный join синтаксис и псевдонимы таблиц.

select r.roomname, AVG(g.ranking) 
from room r join 
    guest g 
    on r.name = g.name 
group by r.roomname; 

Кроме того, таблица room не на самом деле нужно.

1

Что касается вашего второго вопроса, основной должна быть такой присоединиться:

select room.roomname 
from room 
join reservation r1 on room.roomname = r1.roomname 
join reservation r2 on room.roomname = r2.roomname 

, а затем, где положение является сложная часть:

where (r1.moveinday < r2.moveinday and r1.moveoutday > r2.moveoutday) 
or (r1.moveinday < r2.moveinday and r1.moveoutday > r2.moveinday) 
or (r1.moveinday < r2.moveoutday and r1.moveoutday > r2.moveoutday) 

1-й случай: r1 полностью содержит r2.

2-й случай: r1 перекрывает движение в день r2

3-й случай: r1 перекрывает движение за день r2

вы можете захотеть использовать < =,> =, зависит, как ты рассмотрим этот случай. Если вы хотите использовать < =,> = (вместо <.>), Я рекомендую вам добавить уникальный идентификатор для каждой брони, так как вам нужно будет добавить к предложению where что-то вроде r1.ID <> r2. ID