MySQL-使用默认值连接

MySQL-使用默认值连接,mysql,Mysql,我有来自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

我有来自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
+--------------------+---------------------------------------+-------+
| 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                               |
我用什么查询得到这样的结果? 到目前为止,我只是尝试左外连接,但没有运气

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
我们可以在派生表中获得2018年的所有唯一日期。数据上的Year函数不允许使用索引。我已将它改为在…之间使用。。这样它就可以使用索引了。 类似地,在单独的派生表中获取所有唯一状态。 在它们之间交叉连接以获得所有可能的组合。 现在,使用这个all_组合并左键连接到您的主查询(关于状态和日期),以获得所需的结果集。 请尝试以下操作:

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

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

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

要获得该输出,您需要创建tipe值与请求表中每个不同日期的交叉联接:

这将为您提供一个如下所示的表:

+--------------------+---------------------------------------+-------+
| 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
+--------------------+---------------------------------------+-------+
| 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                               |
然后,您可以将其左键连接到请求表,以获得所需的结果:

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

谢谢你的兄弟尼克和你已经用过的

这是我的最后一个问题。 我创建了一个基于唯一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

对不起,兄弟,这不管用。仍然默认列表未加载OK,我建议您尝试Nick的查询。但请避免在日期列上使用函数,如YEARrequest.tanggal_permintaan='2018'请参见上面的查询。也基本上看你给我一个启示。谢谢