У меня проблемы с оператором выбора. На данный момент у меня есть это -
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);
Мне нужна помощь, так это как правильно структурировать оператор, чтобы он выводил отдельные строки для каждого стола с соответствующей информацией.
1 ответ
Вам не хватает GROUP BY
для выполнения агрегатной функции:
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;
В MySQL вам не нужно GROUP BY
все поля в списке выбора, но в других СУБД вам придется использовать:
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 Fiddle с демонстрацией
Если вы хотите сделать это без подзапроса:
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 Fiddle с демонстрацией
Похожие вопросы
Новые вопросы
mysql
MySQL — это бесплатная система управления реляционными базами данных (RDBMS) с открытым исходным кодом, которая использует язык структурированных запросов (SQL). НЕ ИСПОЛЬЗУЙТЕ этот тег для других БД, таких как SQL Server, SQLite и т. д. Это разные БД, которые используют свои собственные диалекты SQL для управления данными. В вопросе всегда указывайте точную версию сервера. Версии 5.x сильно отличаются по своим возможностям от версий 8+.