MySQL连接三个表

标签 mysql sql

我有三个表:Products、Requests、Bookings。

Table Products (with all product categories):
name, ..
A1, ..
A1, ..
A2, ..
A2, ..
A2, ..
A3, ..
B1, ..
..

Table Requests (with a state for every request):
name, failed 
A1, 0
A2, 1
A3, 0
A2, 0
..

Table Bookings:
name, ..
A1, ..
A2, ..
..

我需要的是包含如下摘要数据的合并输出:

prod_category, count_requests, count_failed, count_bookings
A1, 1, 0, 1
A2, 2, 1, 1
A3, 6, 0, null
B1, null, null, null

我已经有三个单独的查询 - 它们运行良好,但我无法只使用一个查询。

这是我的一个 sql 查询的示例:

SELECT
    T2.n AS category_name, T1.c AS count_requests
FROM
    (SELECT
       object_name as n,
       count(object_name) as c
    FROM
       requests
    GROUP BY n) T1
    RIGHT JOIN
    (SELECT distinct
       object_name as n
    FROM
       products) T2 ON T1.n = T2.n
ORDER BY T2.n ASC;

查询的输出:

# category_name, count_requests
'A1', '8'
'A2', '3'
'C1', NULL
'E1', '9'
'E2', '16'
'E3', '3'
'F1', '1'

最佳答案

假设所有未失败的请求也导致预订中的一行,则根本不需要加入预订。

select p.name, 
      count(r.name) as count_requests, 
      sum(r.failed) as count_failed,
      count(r.name) - sum(r.failed) as count_bookings
  from products p
  left join requests r on (p.name = r.name)
 group by p.name;

http://sqlfiddle.com/#!2/da461/6

关于MySQL连接三个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22877865/

相关文章:

sql - 使用重叠事件计算工作时间 (SQL)

php - 这个 MySQL 准备好的语句有什么问题? "unkown column in where clause"

android - 如何获取SQL数据库中的行数?(Android SDK)

Mysql UTF-8意外字符整理

mysql - 具有最终状态条件的排名

java - 我想从 ListView 中选择用户名文本字段并使用该用户名删除 mysql 数据库中存在的数据

mysql - 使用mysql在一个查询中选择多个表中的 child 总数

sql - 关于获取历史数据交易平均最大值的想法

sql - 如何将具有相同字段的两个表的结果合并到一个字段中?

mysql - MYSQL 输出错误