MySQL — Много к одному из комнаты в квартиру: как получить комнату по самой низкой цене для квартиры без необходимости перебирать все комнаты?

#php #mysql #database

#php #mysql #База данных

Вопрос:

Это мои модели, комната и квартира.

Мой вопрос в том, если я не хочу получать комнату с самой низкой ценой для квартиры, обязательно ли мне сначала получить все комнаты, перебрать их и определить комнату с самой низкой ценой?

Возможно ли, возможно ли добавить FK из квартиры в комнату, которая автоматически изменится на комнату с самой низкой ценой, если я введу / отредактирую / удалю новые комнаты для квартиры?

Предоставляет ли MySQL какие-либо механизмы для решения этой проблемы?

Заранее спасибо.

Комментарии:

1. dev.mysql.com/doc/refman/5.0/en/… MIN () Не могли бы вы предоставить дополнительную информацию о запросе и / или полях таблицы DB

Ответ №1:

 SELECT apartment.ID, 
    MIN(room.Price) 
FROM room 
    JOIN apartment ON room.apartmentID=apartment.ID 
GROUP BY apartment.ID;
  

Я, очевидно, догадываюсь о ваших отношениях.

Ответ №2:

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

Квартира (ApartmentID, Name …) Номер (roomId, ApartmentID, Цена …)

 select RoomID from Room where ApartmentID = x order by price desc limit 1
  

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

Ответ №3:

 SELECT * FROM rooms WHERE apartment = "apartment1" ORDERED BY price DESC
  

Самая дешевая комната будет первым элементом выбора. Добавьте обратное соотношение между комнатами и соответствующей квартирой

Комментарии:

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

2. «ЗАКАЗАНО МЕТОДОМ описания» сначала вернет самую дорогую комнату.

Ответ №4:

Это должно сработать:

 SELECT
  rooms.price,
  apartments.id
FROM rooms
JOIN apartments
WHERE rooms.apartment_id = apartments.id
ORDER BY rooms.price ASC
LIMIT 1
  

Добавьте в список ВЫБОРА все, что вам нужно, если это все, что вам нужно, информация, конечно, уже есть в таблице rooms, поэтому не было бы необходимости ПРИСОЕДИНЯТЬСЯ.

Ответ №5:

Возможно ли, возможно ли добавить FK из квартиры в комнату, которая автоматически изменится на комнату с самой низкой ценой, если я введу / отредактирую / удалю новые комнаты для квартиры?

Нет, внешние ключи предназначены не для этого.

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

Но в вашем случае это просто…

 SELECT room.id
FROM room
WHERE room.apartment=?
ORDER BY room.price ASC
LIMIT 0,1
  

(где? обозначает идентификатор для выбора квартиры).

Или, если вы хотите самую дешевую цену во всех квартирах, что-то вроде….

 SELECT apartment.name, apartment.id...., MIN(room.price)
FROM room INNER JOIN apartment 
  ON (room.apt_id=apartment.id)
GROUP BY apartment.name, apartment.id....
  

Найти, какая комната в каждой квартире самая дешевая, немного сложнее — рассмотрим сценарий, в котором у вас есть несколько комнат, каждая по одинаковой (самой низкой) цене. Вам нужно будет использовать трюк с максимальным объединением.