Mysql вопрос объединения столов - PullRequest
1 голос
/ 21 сентября 2009

У меня есть столы, номера, апартаменты и гостиница. Теперь мне легко получить все свободные номера, название отеля или адрес квартиры, используя отдельные запросы, например:

Получить все свободные номера:

SELECT hotel.name, count(*) AS num_of_free_rooms
FROM hotel, rooms
WHERE rooms.occupied !=0
  AND hotel.hotel_id = rooms.room_hotel
GROUP BY hotel.hotel_id

Получить все свободные квартиры:

SELECT hotel.name, count(*) AS num_of_free_ap
FROM hotel, apartments
WHERE apartments.occupied_ap !=0
  AND hotel.hotel_id = apartments.apartment_hotel
GROUP BY hotel.hotel_id

Как я могу получить такие результаты:

Название отеля | Количество свободных номеров кроме 0 | Количество квартир 0 или любой другой

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

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

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

Помните, что вам не нужно решать каждую проблему в SQL одним запросом! Выполнение отдельных запросов проще и часто выполняется быстрее, чем один слишком сложный запрос. Поэтому не забывайте о возможности простого запуска двух запросов.

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

Дополнительные параметры см. В моем ответе в " Таблица продуктов, много видов продуктов, каждый продукт имеет много параметров ."

1 голос
/ 21 сентября 2009

Вы можете использовать это, пока кто-то не придет (более) эффективное решение:)

SELECT tmp.name, tmp.num_of_free_rooms, num_of_free_ap
FROM
  (SELECT hotel.name, count(*) AS num_of_free_rooms
  FROM hotel, rooms
  WHERE rooms.occupied !=0
    AND hotel.hotel_id = rooms.room_hotel
  GROUP BY hotel.hotel_id) AS tmp
LEFT JOIN
  (SELECT hotel.name, count(*) AS num_of_free_ap
  FROM hotel, apartments
  WHERE apartments.occupied_ap !=0
    AND hotel.hotel_id = apartments.apartment_hotel
  GROUP BY hotel.hotel_id) AS tmp2
ON tmp1.hotel.name = tmp2.hotel_name
WHERE tmp.num_of_free_rooms > 0
0 голосов
/ 21 сентября 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...