2016-04-29 5 views
1
room  | beds available | ****table room**** 
================================== 
room1  | 4 
room2  | 2 
room3  | 4 

room  | occupant  | ****table occupant**** 
================================== 
room1  | arnold 
room1  | berry 
room2  | charles 
room2  | daisy 
room3  | eric 
room3  | frank 
room3  | greg 

я, глядя, чтобы получить следующий вывод:Counting суммарное поле против другого значения столбца таблицы

Количество номеров с койко-мест: 2 || Номера с койками: комната 1, комната 3

я считаю, что мне нужны

  1. счет магазина * для каждого уникального помещения и хранить счетчик как массив
  2. вычитает кровати, доступные для каждой комнаты против этого массив
  3. отображать название комнаты, когда есть результат> 0

Как следует PHP фрагмент кода выглядит?

+0

Просто прежде чем ответить, позвольте мне прояснить : хотите ли вы вычислить доступные кровати, вычитая количество пассажиров из таблицы «человек» из числа в таблице «номер»? – James

+0

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

+0

Какие СУБД вы используете? –

ответ

1

Эти SQL-запросы будут делать трюк.

Помните, что вы можете удалить ненужные столбцы, чтобы сохранить объем данных вы обрабатываете ...

select r.id AS 'room', 
    r.beds as 'total_beds', 
    count(o.occupant) as 'taken_beds', 
    r.beds-count(o.occupant) as 'free_beds' 

FROM room r LEFT JOIN occupant o ON r.id = o.room 
GROUP BY r.id 

HAVING r.beds > count(o.occupant) 

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

MySQL Result

Если в любой другой точке, вы хотите вернуть полные номера тоже, просто удалите «ИМЕТЬ» пункт

select r.id AS 'room', 
    r.beds as 'total_beds', 
    count(o.occupant) as 'taken_beds', 
    r.beds-count(o.occupant) as 'free_beds' 

FROM room r LEFT JOIN occupant o ON r.id = o.room 
GROUP BY r.id 

MySQL Result without HAVING clause

+0

Привет, Джеймс, можно ли посчитать количество строк результата отдельно? Номера, которые не заполнены: 2 –

+0

ОК, я просто завернул весь запрос в счет (*), и это делает это !!! –

+0

Если номер не принят вообще, он не отображается в этом запросе. т. е. если в комнате 2 свободных кроватей = 2, то будет отображаться только комната 1 и комната 3. Как я могу показать все 3? –

0

Я думаю, что все это можно сделать с помощью простого SQL запроса, который должен выглядеть примерно так:

SELECT room.beds AS beds, COUNT(occupant.occupant) AS beds_occupied 
FROM room 
LEFT JOIN occupant ON occupant.room = room.room 
GROUP BY room 
HAVING (beds - beds_occupied) > 0; 

Вы можете использовать «HAVING» пункт, который похож на ИНЕКЕ, но работает с агрегатами. Я не выполнял этот точный запрос на ваших точных таблицах, поэтому может быть опечатка, однако я надеюсь, что идея, которую должен делать запрос, понятна.

0

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

SELECT r.*, COUNT(*) AS occupied, r.beds - COUNT(*) AS rest 
FROM room r 
LEFT JOIN occupant o ON r.room = o.room 
GROUP BY r.room 
HAVING r.beds - occupied >= 1 
0

MySQL предлагает GROUP_CONCAT агрегировать строки:

select 
    count(*) as number_of_rooms, 
    group_concat(room) as rooms 
from room r 
where beds_available > 
(
    select count(*) 
    from occupant o 
    where o.room = r.room 
); 

Этот выбор номера с большим количеством койко-мест, чем заняты а затем объединяет результирующие строки в одну строку, содержащую количество доступных комнат, и строку с именами комнат, разделенных запятой.

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