2016-04-29 18 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 

別のテーブルの列の値に対して、合計2 ||利用できるベッドの部屋:部屋1、部屋3カウントフィールド、私は次のような出力を得るために探して

私はそれぞれのユニークな部屋に

  1. 店舗数*に必要数えると、このに対する各部屋で利用可能な配列
  2. 減算ベッドとしてカウント数を保存します結果があるとき配列
  3. 表示ルーム名>は0

はどのようにPHPのスニペットコードは次のようになりますか?

+0

を削除あなたは "占有者"テーブルから "部屋"テーブルの番号から占有者の数を差し引いて利用可能なベッドを計算しますか? – James

+0

こんにちはJames、私は実際に利用可能なベッドを計算するつもりはありません。そのために私は合計(利用可能なベッド数)を占有者*から計算しました。 ベッドの利用可能な部屋数をカウントする2.客室名を表示する –

+0

どのDBMSを使用していますか? –

答えて

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

こんにちはJamesさん、結果の行数を別々に数えることは可能ですか? 満室ではない:2 –

+0

ok、私はちょうどカウント(*)内の全体のクエリーをラップし、それはそれをする!!! –

+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; 

あなたはWHERE句に似ていますが、集合体と連携「を有する」節を使用することができます。私はあなたの正確なテーブルでこの正確なクエリを実行していないので、タイプミスがあるかもしれませんが、クエリが行うはずのアイデアがはっきりしていることを願っています。

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 
); 

これは占有より利用できるより多くのベッド付きの客室を選択結果として得られる行を、利用可能な部屋の数と部屋名がカンマで区切られた文字列を含む1つの行に集約します。

関連する問題