Mysql从不同的表中选择

时间:2010-10-31 13:43:33

标签: mysql

我想结合这四个查询来获得这个结果:

Vendors
-----------
select i_vendor, name as Vendor from Vendors

Customers
-----------
select i_customer, name as Customer from Customers

Calls
-----------
select i_vendor,i_customer, id as Call, date_format(connect_time,"%Y-%m-%d %H") as Date, duration from CDR_Vendors where connect_time between curdate() and now()

Failed_Calls
------------
select i_vendor,i_customer, id as Failed_Call, date_format(connect_time,"%Y-%m-%d %H") as Date from CDR_Vendors_Failed where connect_time between curdate() and now()

Result
------------
Date, Vendor, Customer, Count(Call), Count(Failed_Call), Sum()duration

2010-10-30 00 | Vendor1 | Customer1 | 100 | 300 | 8000
2010-10-30 01 | Vendor1 | Customer2 | 267 | 100 | 2000
2010-10-30 02 | Vendor1 | Customer3 | 388 | 20  | 100

2010-10-30 00 | Vendor2 | Customer1 | 140 | 120 | 50
2010-10-30 01 | Vendor2 | Customer2 | 102 | 309 | 529
2010-10-30 02 | Vendor2 | Customer3 | 156 | 78  | 1000

2010-10-30 00 | Vendor3 | Customer1 | 190 | 567 | 876
2010-10-30 01 | Vendor3 | Customer2 | 215 | 987 | 765
2010-10-30 02 | Vendor3 | Customer3 | 383 | 321 | 123

我使用单个客户和单个供应商测试了以下查询,但需要很长时间

SELECT
          Vendors.name as Vendor,
          Customers.name as Customer
                  date_format(connect_time,"%Y-%m-%d %H") AS date,
                  Failed.NotConnected,
                  count(id) as calls,
                  sum(`duration`)
   FROM test.`CDR_Vendors`
       inner join Vendors on (CDR_Vendors.i_vendor = Vendors.i_vendor)
       inner join Customers on (CDR_Vendors.i_customer = Customers.i_customer)
       inner join
               (SELECT
               Vendors.name as Vendor,
               Customers.name as Customer,        
               date_format(connect_time,"%Y-%m-%d %H") AS date,
               Count(id) as NotConnected
               FROM `CDR_Vendors_Failed`
               inner join Vendors on (CDR_Vendors_Failed.i_vendor = Vendors.i_vendor)
               inner join Customers on (CDR_Vendors_Failed.i_customer = Customers.i_customer)
               WHERE
               Customers.name = "Customer1"
               and
               Vendors.name = "Vendor1"
               and connect_time between curdate() and now()
               GROUP by date
               ORDER BY date
            )Failed on Failed.date = date_format(connect_time,"%Y-%m-%d %H")
       WHERE
       Customers.name = "Customer1"
       and
       Vendors.name = "Vendor1"
       and connect_time between curdate() and now()
       GROUP by date
       ORDER BY date

请问,获得结果的最佳方式是什么?

提前谢谢

2 个答案:

答案 0 :(得分:1)

我认为您可以通过观看 - >采取更好的方法Introduction to Views

答案 1 :(得分:0)

尝试此查询

SELECT
    count(cid) as CALLS,
    count(fid) as FAILED_CALLS,
    DateHour,
    vendor as Vendor,
    customer as Customer,
    Sum(duration) as Duration
FROM
    (
        SELECT
            c.id as cid,
                    NULL as fid,
            date_format(connect_time,"%Y-%m-%d %H") as DateHour,
            cu.name as customer,
            v.name as vendor,
            c.duration
        FROM
            calls as c
                left join
                    customers as cu
                        on
                            cu.i_customer = c.i_customer
                left join
                    vendors as v
                        on
                            v.i_vendor = c.i_vendor
        WHERE
            date_format(connect_time,"%Y-%m-%d %H") between CURDATE() and NOW()
        GROUP BY
            DateHour, customer, vendor

        UNION

        SELECT
                    NULL as cid,
            c.id as fid,
            date_format(connect_time,"%Y-%m-%d %H") as DateHour,
            cu.name as customer,
            v.name as vendor
        FROM
            failed_calls as c
                left join
                    customers as cu
                        on
                            cu.i_customer = c.i_customer
                left join
                    vendors as v
                        on
                            v.i_vendor = c.i_vendor
        WHERE
            date_format(connect_time,"%Y-%m-%d %H") between CURDATE() and NOW()
        GROUP BY
            DateHour, customer, vendor
    ) as tmp_table
GROUP BY
    DateHour, vendor, customer;

我没有尝试运行它。但我希望这会以你期望的方式发挥作用。如果它没有,请给我你的数据库结构(或最好创建表)和一些虚拟数据。我会为你写一个正确的查询。 :)