mysql - 从一个表中选择多行,而另一表的计数为

标签 mysql

我在使用 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"

这与我想要的很接近,但是 table 上还有另一张 table ,称为“Desk 2”,这是它完全忽略的。事实上,如果第 2 号办公 table 有预订,它会将其计数包含在显示的第 1 号办公 table 的计数中...

整个表结构如下:

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

我需要帮助的是如何正确构造该语句,以便它将为每个办公 table 输出单独的行及其相关信息。

最佳答案

您缺少一个 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,但在其他 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 Fiddle with Demo

如果您想在不使用子查询的情况下执行此操作:

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 with Demo

关于mysql - 从一个表中选择多行,而另一表的计数为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14325517/

相关文章:

mysql - 如何从MySQL中具有日期计算的查询结果创建表?

php - 在输入表单中显示来自不同表的字段

php - 将数据插入两个数据库,其中一个是第三方数据库

PHP Union - 仅当表名 = table1 时显示数据

MYSQL查找最大值

mysql语法错误为什么?

MySQL - 替换列字符串中的特定字符

php - 引用自增列?

php - Apache HTTP 服务器 (PHP/MySQL) 中的 GIS 应用程序

mysql - 使用 NOT IN 语句的 PHP 选择查询