2016-11-06 2 views
0

Я пытаюсь написать запрос, который делает ниже:Регистрация ошибок и заказ

Для каждого гостя, который имеет слово «Эдинбург» в их адрес показать общее количество забронированных ночей. Обязательно укажите 0 для тех гостей, которые никогда не бронировали. Покажите фамилию, имя, адрес и количество ночей. Закажите фамилию, затем имя.

У меня возникли проблемы с созданием присоединиться к работе должным образом, ER Диаграмма Snippet:

ER Diagram snippet

Вот мой текущий (прерывистая) решение:

SELECT last_name, first_name, address, nights 
FROM booking 
RIGHT JOIN guest ON (booking.booking_id = guest.id) 
WHERE address LIKE '%Edinburgh%'; 

Вот результаты этого запроса:

enter image description here

Запрос частично завершено, надеясь кто-то может помочь мне и создать рабочую версию. Я в настоящее время изучаю SQL, поэтому извиняюсь, если это довольно простой или немой вопрос!

+0

Вы уверены, что мы должны делать свою домашнюю работу? – Strawberry

ответ

1

Ваш запрос кажется почти правильным. Вы присоединились к идентификатору бронирования с идентификатором guets, который дал вам некоторые результаты из-за перекрытия (соответствия) идентификаторов, но это скорее всего не соответствует внешним ключам. Вы должны присоединиться к guest_id от бронирования до id от гостя.

Я хотел бы добавить группировки суммировать все заказанные ночи для конкретного гостя (при условии, что ночи является целым числом):

SELECT g.last_name, g.first_name, g.address, SUM(b.nights) AS nights 
FROM guest AS g 
LEFT JOIN booking AS b ON b.guest_id = g.id 
WHERE g.address LIKE '%Edinburgh%' 
GROUP BY g.last_name, g.first_name, g.address; 

Вы уверены, что ночи, проведенные должны быть рассчитаны с использованием nights поле? Почему это может быть null? Если вы хотите, чтобы показать нуль при нулевых значениях просто завернуть с функцией Coalesce подобное:

COALESCE(SUM(b.nights), 0) 

Примечания:

  • переписан RIGHT JOIN в LEFT JOIN, но это не влияет на результаты - это просто чище для меня
  • Использование псевдонимов, например. AS g делает код короче при определении объединяемых столбцах
  • Reference каждый столбец с их таблицы псевдонимов, чтобы избежать неоднозначности
+0

Большое спасибо за ваше объяснение.С этого момента я буду использовать псевдонимы. – Aidan

+0

'b.booking_id = g.id' - правда? –

+0

@PaulSpiegel Я не проверял логику соединения. Спасибо за указание. Соответственно обновляется ответ. Это, похоже, вызывает проблему. –

-1

Это сообщение отвечает на ваши вопросы о том, как сделать запрос.

MySQL SUM with same ID

Вы можете просто использовать COALESCE как указано здесь, чтобы избежать NULL значений

How do I get SUM function in MySQL to return '0' if no values are found?

+0

Кроме того, поскольку у вас может быть возможность записи с одинаковыми именами, я бы настоятельно рекомендовал использовать уникальный идентификатор записи в вашем процессе. – Jeff

0
SELECT g.first_name, 
     g.last_name, 
     g.address, 
     COALESCE(Sum(b.nights), 0) 
FROM booking b 
     RIGHT JOIN guest g 
       ON (b.guest_id = g.id) 
WHERE address LIKE 'edinburgh%' 
GROUP BY g.last_name, 
      g.first_name, 
      g.address; 
+4

Пожалуйста, отредактируйте вопрос, чтобы добавить объяснение, почему вы думаете, что использование coalesce здесь важно. Кроме того, пожалуйста, отформатируйте свой код для чтения. –

Смежные вопросы