Вывод списка имен с количеством аргументов в другой таблице - mysql - PullRequest
0 голосов
/ 30 марта 2020

Не знаю, как это описать, я искал inte rnet в течение нескольких часов и довольно оцепенел. У меня есть две таблицы. Один называется отель, другой называется номер. Само собой разумеется, но отель - это список отелей, в которых первичным ключом является hotelNo, с указанием их города и названия, а в номере есть другая информация, а в качестве внешнего ключа первичного ключа отеля указывается hotelNo.

hotel

+---------+---------------------+----------+
| hotelNo | hotelName           | city     |
+---------+---------------------+----------+
|       1 | Grosvenor Hotel     | Sydney   |
|       2 | ANA Hotel           | Sydney   |
|       3 | Great Mansion Hotel | Brisbane |
|       4 | Grand Hotel         | Brisbane |
|       5 | Central Hotel       | Sydney   |
|       6 | Airport Hotel       | Sydney   |
+---------+---------------------+----------+

и номер

+--------+---------+------+--------+
| roomNo | hotelNo | type | rate   |
+--------+---------+------+--------+
|    101 |       1 | S    | 120.00 |
|    101 |       2 | D    | 100.00 |
|    101 |       3 | S    |  80.00 |
|    101 |       5 | D    | 180.00 |
|    102 |       1 | S    | 120.00 |
|    102 |       2 | S    |  80.00 |
|    102 |       3 | S    |  80.00 |
|    102 |       5 | K    | 190.00 |
|    103 |       1 | S    | 120.00 |
|    103 |       3 | D    | 100.00 |
|    103 |       5 | S    | 120.00 |
|    104 |       1 | D    | 150.00 |
|    104 |       4 | Q    | 100.00 |
|    104 |       5 | D    | 140.00 |
|    105 |       1 | D    | 150.00 |
|    105 |       4 | Q    | 500.00 |
|    106 |       1 | D    | 150.00 |
|    107 |       1 | Q    | 180.00 |
|    108 |       1 | Q    | 180.00 |
|    109 |       1 | Q    | 180.00 |
+--------+---------+------+--------+

Мне задают вопрос

"Перечислите названия отелей в Сиднее, в которых есть 3 или более номеров. "

и я хочу, чтобы в качестве выходных данных я назвал отели

+---------------------+
| hotelName           |
+---------------------+
| Grosvenor Hotel     |
| Central Hotel       |
+---------------------+

Любая помощь будет отличной, так как у меня есть кое-что наверстать. веселит

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Поскольку некоторые спойлпорты показали решение (извините за это; это было бы хорошим упражнением для вас), я показываю альтернативы для эффекта обучения.

Использование IN

Вы хочу только выбрать названия отелей. Так зачем вообще присоединяться?

select hotelname
from hotels
where hotelno in
(
  select hotelno
  from rooms
  group by hotelno
  having count(*) >= 3
)
order by hotelname;

Агрегировать перед присоединением

Если вы хотите показать количество в результатах, то присоединяйтесь. Несмотря на то, что запрос становится длиннее и немного сложнее, его рекомендуется объединять перед объединением. Это особенно полезно в тех случаях, когда вам нужны агрегаты из разных таблиц.

select h.hotelname, r.room_count
from hotels h
join
(
  select hotelno, count(*) as room_count
  from rooms
  group by hotelno
  having count(*) >= 3
) r on r.hotelno = h.hotelno
order by h.hotelname;
0 голосов
/ 30 марта 2020

Просто сделайте то, что предлагает приведенный выше комментарий, и объедините две таблицы, агрегированные по отелям:

SELECT
    h.hotelNo,
    h.hotelName
FROM hotel h
INNER JOIN room r
    ON h.hotelNo = r.hotelNo
GROUP BY
    h.hotelNo,
    h.hotelName
HAVING
    COUNT(*) >= 3;

Обратите внимание, что я выбираю (и агрегирую), используя как название отеля, так и номер отеля. Это должно охватить ситуацию, когда два австралийских отеля могут иметь одно и то же имя.

...