代码之家  ›  专栏  ›  技术社区  ›  Fadly Dzil

MySQL-使用默认值连接

  •  -1
  • Fadly Dzil  · 技术社区  · 6 年前

    我有来自MySql语句的标准数据

    SELECT tipe.* 
      FROM 
         ( SELECT 'Menunggu Approve Atasan' AS tipe UNION
           SELECT 'Sudah Approved Atasan' UNION
           SELECT 'Dalam Proses Pengerjaan IT' UNION
           SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION
           SELECT 'Ditutup'
          ) AS tipe;
    +---------------------------------------+
    | tipe                                  |
    +---------------------------------------+
    | Menunggu Approve Atasan               |
    | Sudah Approved Atasan                 |
    | Dalam Proses Pengerjaan IT            |
    | Sudah Selesai Tapi Belum Ditutup User |
    | Ditutup                               |
    +---------------------------------------+
    5 rows in set (0.02 sec)
    

    我有这样的数据

    SELECT requests.* 
      FROM 
         ( SELECT DATE(request.tanggal_permintaan) as tanggal_permintaan
           , request.`status`
           , COUNT(*) as total
        FROM request
       WHERE YEAR(request.tanggal_permintaan) = '2018'
       GROUP 
        BY DATE(request.tanggal_permintaan)
           , request.status
          ) AS requests;
        +--------------------+---------------------------------------+-------+
        | tanggal_permintaan | status                                | total |
        +--------------------+---------------------------------------+-------+
        | 2018-01-02         | Menunggu Approve Atasan               |     1 |
        | 2018-01-02         | Ditutup                               |     4 |
        | 2018-01-03         | Ditutup                               |     1 |
        +--------------------+---------------------------------------+-------+
    3 rows in set (0.02 sec)
    

    正如您可以看到的第二个查询的表单结果,它根据日期为我提供数据。但是,我需要在第二个查询中包含所有标准数据。 我需要这样的结果:

    +--------------------+---------------------------------------+-------+
    | tanggal_permintaan | status                                | total |
    +--------------------+---------------------------------------+-------+
    | 2018-01-02         | Menunggu Approve Atasan               |     1 |
    | 2018-01-02         | Sudah Approved Atasan                 |     0 |
    | 2018-01-02         | Dalam Proses Pengerjaan IT            |     0 |
    | 2018-01-02         | Sudah Selesai Tapi Belum Ditutup User |     0 |
    | 2018-01-02         | Ditutup                               |     4 |  // one day
    | 2018-01-03         | Menunggu Approve Atasan               |     0 |
    | 2018-01-03         | Sudah Approved Atasan                 |     0 |
    | 2018-01-03         | Dalam Proses Pengerjaan IT            |     0 |
    | 2018-01-03         | Sudah Selesai Tapi Belum Ditutup User |     0 |
    | 2018-01-03         | Ditutup                               |     1 | // one day
    +--------------------+---------------------------------------+-------+
    

    我用什么问题来得到这样的结果? 到目前为止,我只是尝试左外连接,但没有运气

    SELECT requests.* FROM (
        SELECT
            DATE(request.tanggal_permintaan) as tanggal_permintaan,
                request.`status`,
                COUNT(*) as total
        FROM request
        WHERE YEAR(request.tanggal_permintaan) = '2018'
        GROUP BY DATE(request.tanggal_permintaan), request.status
    ) requests
    
    LEFT OUTER JOIN (
        SELECT tipe.* FROM(
            SELECT 'Menunggu Approve Atasan' AS tipe UNION
            SELECT 'Sudah Approved Atasan' UNION 
            SELECT 'Dalam Proses Pengerjaan IT' UNION 
            SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION 
            SELECT 'Ditutup'
        ) tipe
    )standard 
    ON standard.tipe = requests.status
    
    ORDER BY requests.tanggal_permintaan
    
    4 回复  |  直到 6 年前
        1
  •  2
  •   Nick SamSmith1986    6 年前

    要获得该输出,您需要创建一个 CROSS JOIN 你的 tipe 值,其中每个日期都不同 request 表:

    SELECT r.date, t.tipe
    FROM (SELECT 'Menunggu Approve Atasan' AS tipe UNION
          SELECT 'Sudah Approved Atasan' UNION 
          SELECT 'Dalam Proses Pengerjaan IT' UNION 
          SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION 
          SELECT 'Ditutup'
         ) t
    CROSS JOIN 
        (SELECT DISTINCT DATE(tanggal_permintaan) AS date 
         FROM request
         WHERE YEAR(tanggal_permintaan) = 2018) r
    

    这将为您提供一张如下所示的桌子:

    | date               | tipe                                  |
    +--------------------+---------------------------------------+
    | 2018-01-02         | Menunggu Approve Atasan               |
    | 2018-01-02         | Sudah Approved Atasan                 |
    | 2018-01-02         | Dalam Proses Pengerjaan IT            |
    | 2018-01-02         | Sudah Selesai Tapi Belum Ditutup User |
    | 2018-01-02         | Ditutup                               |
    | 2018-01-03         | Menunggu Approve Atasan               |
    | 2018-01-03         | Sudah Approved Atasan                 |
    | 2018-01-03         | Dalam Proses Pengerjaan IT            |
    | 2018-01-03         | Sudah Selesai Tapi Belum Ditutup User |
    | 2018-01-03         | Ditutup                               |
    

    那你可以 LEFT JOIN 对你的 requests 表以获得所需的结果:

    SELECT s.date, s.tipe, COUNT(*) AS total
    FROM (SELECT r.date, t.tipe
          FROM (SELECT 'Menunggu Approve Atasan' AS tipe UNION
                SELECT 'Sudah Approved Atasan' UNION 
                SELECT 'Dalam Proses Pengerjaan IT' UNION 
                SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION 
                SELECT 'Ditutup'
               ) t
          CROSS JOIN 
              (SELECT DISTINCT DATE(tanggal_permintaan) AS date 
               FROM request
               WHERE YEAR(tanggal_permintaan) = 2018) r
         ) s
    LEFT JOIN request rq ON rq.status = s.tipe
    GROUP BY s.date, s.tipe
    
        2
  •  1
  •   Madhur Bhaiya    6 年前
    • 我们可以在派生表中获得2018年的所有唯一日期。 Year() 函数不允许使用索引。我把它改成了 Between.. 这样它就可以使用索引了。
    • 同样,在一个单独的派生表中获取所有唯一的状态。
    • Cross Join 在它们之间找到所有可能的组合。
    • 现在,用这个 all_combinations left join 对于你的主要问题, 在…上 status date ,以获得所需的结果集。

    尝试以下方法:

    SELECT all_combinations.tanggal_permintaan, 
           all_combinations.tipe, 
           COALESCE(requests.total, 0) AS total 
    FROM 
    (
      SELECT all_tanggal_permintaan.tanggal_permintaan, 
             all_tipe.tipe 
      FROM 
      (SELECT DISTINCT DATE(tanggal_permintaan) as tanggal_permintaan
       FROM request 
       WHERE tanggal_permintaan BETWEEN '2018-01-01 00:00:00' AND 
                                        '2018-12-31 23:59:59'
      ) AS all_tanggal_permintaan 
    
      CROSS JOIN 
    
      (SELECT 'Menunggu Approve Atasan' AS tipe UNION ALL
       SELECT 'Sudah Approved Atasan' UNION ALL
       SELECT 'Dalam Proses Pengerjaan IT' UNION ALL
       SELECT 'Sudah Selesai Tapi Belum Ditutup User' UNION ALL
       SELECT 'Ditutup'
      ) AS all_tipe
    ) AS all_combinations 
    
    LEFT OUTER JOIN
    
    (
      SELECT
        DATE(tanggal_permintaan) as tanggal_permintaan,
        status,
        COUNT(*) AS total 
      FROM request
      WHERE tanggal_permintaan BETWEEN '2018-01-01 00:00:00' AND 
                                       '2018-12-31 23:59:59'
      GROUP BY DATE(tanggal_permintaan), status
    ) AS requests 
    ON requests.tanggal_permintaan = all_combinations.tanggal_permintaan AND 
       requests.status = all_combinations.tipe
    
    ORDER BY all_combinations.tanggal_permintaan
    
        3
  •  1
  •   Adrian Maxwell    6 年前

    这是一个猜测,但似乎您需要一个状态值列表,这让我惊讶,它还没有在表中,但这可能会起作用:

    SELECT
        g.tanggal_permintaan, g.total, s.status
    FROM (
        SELECT DISTINCT
            request.status
        FROM request
    ) s
    LEFT JOIN (
            SELECT
                DATE(request.tanggal_permintaan) AS tanggal_permintaan
               ,request.status
               ,COUNT(*)                         AS total
            FROM request
            WHERE request.tanggal_permintaan) >= '20180101'
              AND request.tanggal_permintaan) <  '20190101'
            GROUP BY
                DATE(request.tanggal_permintaan)
               ,request.status
        ) g
        ON s.status = g.status
    
        4
  •  0
  •   Fadly Dzil    6 年前

    感谢兄弟@Nick和@Used_已经被_使用了

    这是我的最后一个问题。 我创建了一个基于唯一id的concat,通过左连接将它们连接起来。

    SELECT standard.*, transactions.* FROM (
        SELECT CONCAT(r.date, '#', t.tipe) as 'id', r.date AS tanggal_permintaan, t.tipe
        FROM (
             SELECT DISTINCT
                 request.status AS tipe
             FROM request
        ) t
        CROSS JOIN (
            SELECT DISTINCT DATE(tanggal_permintaan) AS date 
            FROM request
            WHERE YEAR(request.tanggal_permintaan) = '2018' 
        ) r
    
    ) AS standard
    
    LEFT JOIN (
        SELECT CONCAT(requests.tanggal_permintaan, '#' , requests.status) AS 'id', requests.tanggal_permintaan, requests.status, requests.total 
        FROM (
            SELECT
                DATE(request.tanggal_permintaan) as tanggal_permintaan,
                request.`status`,
                COUNT(*) as total
            FROM request
            WHERE YEAR(request.tanggal_permintaan) = '2018'
            GROUP BY DATE(request.tanggal_permintaan), request.status
        ) requests
    ) AS transactions
    ON transactions.id = standard.id
    
    ORDER BY standard.id