Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Dapatkan data dari dua tabel untuk membuat kalender acara

DIPERBARUI

SELECT user_id,
       COALESCE(MIN(CASE WHEN  1 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `1`,
       COALESCE(MIN(CASE WHEN  2 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `2`,
       COALESCE(MIN(CASE WHEN  3 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `3`,
       COALESCE(MIN(CASE WHEN  4 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `4`,
       COALESCE(MIN(CASE WHEN  5 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `5`,
       COALESCE(MIN(CASE WHEN  6 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `6`,
       COALESCE(MIN(CASE WHEN  7 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `7`,
       COALESCE(MIN(CASE WHEN  8 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `8`,
       COALESCE(MIN(CASE WHEN  9 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `9`,
       COALESCE(MIN(CASE WHEN 10 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `10`,
       COALESCE(MIN(CASE WHEN 11 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `11`,
       COALESCE(MIN(CASE WHEN 12 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `12`,
       COALESCE(MIN(CASE WHEN 13 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `13`,
       COALESCE(MIN(CASE WHEN 14 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `14`,
       COALESCE(MIN(CASE WHEN 15 BETWEEN DAY(start_date) AND DAY(end_date) THEN event_id END), 0) `15`
  FROM 
(
  SELECT id, event_id,
         CASE WHEN start_date < '2013-03-01' THEN '2013-03-01' ELSE start_date END start_date,
         CASE WHEN end_date   > '2013-03-31' THEN '2013-03-31' ELSE   end_date END end_date,
         user_id
    FROM events
   WHERE (start_date >= '2013-03-01' AND end_date <= '2013-03-31')
      OR (start_date <  '2013-03-01' AND end_date  > '2013-03-31')
      OR (start_date  < '2013-03-01' AND end_date BETWEEN '2013-03-01' AND '2013-03-31')
      OR (start_date BETWEEN '2013-03-01' AND '2013-03-31' AND end_date > '2013-03-31') 
) q
 GROUP BY user_id

Keluaran:

| USER_ID | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
-----------------------------------------------------------------------------
|       1 | 0 | 1 | 1 | 3 | 0 | 0 | 0 | 0 | 0 |  0 |  0 |  0 |  0 |  0 |  0 |
|       2 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |  2 |  2 |  2 |  2 |  2 |  2 |
|       3 | 0 | 2 | 2 | 0 | 0 | 0 | 0 | 0 | 0 |  0 |  0 |  0 |  0 |  0 |  0 |

Ini SQLFiddle demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kapan indeks basis data harus dibangun kembali?

  2. Mengikat alamat dan server MySQL

  3. Mengapa Hibernate/JDBC/MySQL memutuskan koneksi setelah sekitar satu hari?

  4. Haruskah SELECT ... FOR UPDATE selalu berisi ORDER BY?

  5. Apa perbedaan semantik antara WHERE dan HAVING?