0

selectステートメントに問題があります。私がこれまでに持っているのはこれです-

SELECT COUNT(booked.desk_id), 
  name, 
  desk.desk_id, 
  phone, 
  fax, 
  dock, 
  pc 
FROM desk, booked 
WHERE desk.desk_id = booked.desk_id 
  AND booking_id >=1 
  AND location = "Cheltenham"

どの出力

"12" "Desk 1" "1" "1" "0" "0" "1"

これは私が欲しいものに近いですが、デスクテーブルにはデスク2と呼ばれる別のデスクがあります。これは完全に無視されています。実際、デスク2の予約がある場合は、デスク1のカウントとして表示されているものにそれらのカウントが含まれます...

テーブル全体の構造は次のとおりです。

table "booked"
INSERT INTO `booked` (`id`, `booking_id`, `desk_id`, `member_id`, `date_booked`) VALUES
(246, 1358121601, 1, 1, 'Monday 14th January at 4:40pm'),
(247, 1358121602, 1, 1, 'Monday 14th January at 4:40pm'),
(248, 1358121604, 1, 1, 'Monday 14th January at 4:40pm'),
(249, 1358121603, 1, 1, 'Monday 14th January at 4:40pm'),
(250, 1358121606, 1, 1, 'Monday 14th January at 4:40pm'),
(251, 1358121605, 1, 1, 'Monday 14th January at 4:40pm'),
(252, 1358121607, 2, 1, 'Monday 14th January at 4:40pm'),
(253, 1358121609, 2, 1, 'Monday 14th January at 4:40pm'),
(254, 1358121608, 2, 1, 'Monday 14th January at 4:40pm'),
(255, 1358121610, 2, 1, 'Monday 14th January at 4:40pm'),
(256, 1358121612, 2, 1, 'Monday 14th January at 4:40pm'),
(257, 1358121611, 2, 1, 'Monday 14th January at 4:40pm');

table "desk"
INSERT INTO `desk` (`location`, `desk_id`, `name`, `phone`, `fax`, `dock`, `pc`) VALUES
('Cheltenham', 1, 'Desk 1', 1, 0, 0, 1),
('Cheltenham', 2, 'Desk 2', 1, 1, 0, 1);

私が助けを必要としているのは、ステートメントを正しく構造化して、関連情報とともに各デスクの個々の行を出力する方法です。

4

1 に答える 1

2

GROUP BY集計関数と一緒に使用するためのaがありません。

SELECT COUNT(booked.desk_id), 
  name, 
  desk.desk_id, 
  phone, 
  fax, 
  dock, 
  pc 
FROM desk
INNER JOIN booked 
    ON desk.desk_id = booked.desk_id 
WHERE booking_id >=1 
  AND location = "Cheltenham"
GROUP BY name;

GROUP BYMySQLでは、選択リストのすべてのフィールドを選択する必要はありませんが、他のRDBMSでは次のものを使用する必要があります。

SELECT COUNT(booked.desk_id), 
  name, 
  desk.desk_id, 
  phone, 
  fax, 
  dock, 
  pc 
FROM desk
INNER JOIN booked 
    ON desk.desk_id = booked.desk_id 
WHERE booking_id >=1 
  AND location = "Cheltenham"
GROUP BY name, desk.desk_id, phone, fax, dock, pc 

サンプルデータとコメントに基づいて、次を使用できます。

SELECT coalesce(CountDesk, 0) Total, 
  name, 
  d.desk_id, 
  phone, 
  fax, 
  dock, 
  pc 
FROM desk d
LEFT JOIN
(
  select COUNT(booked.desk_id) CountDesk,
    desk_id
  from booked 
  WHERE booking_id >=1 
  GROUP BY desk_id
) b
    ON d.desk_id = b.desk_id 
WHERE location = "Cheltenham"

SQL FiddlewithDemoを参照してください

サブクエリなしでこれを実行する場合:

SELECT 
  Coalesce(count(b.desk_id), 0) Total, 
  name, 
  d.desk_id, 
  phone, 
  fax, 
  dock, 
  pc 
FROM desk d
LEFT JOIN booked b
  ON d.desk_id = b.desk_id 
WHERE booking_id >=1 
  AND location = "Cheltenham"
GROUP BY name, d.desk_id, phone, fax, dock, pc ;

SQL FiddlewithDemoを参照してください

于 2013-01-14T19:50:15.077 に答える