2012-08-09 92 views
-1

好吧,讓我重新構建我的同一個問題,以瞄準正確的輸出。如果在mysql表中不存在,添加一個新條目

我有一個表結構如下表。

mysql> desc depot; 
+-------+----------+------+-----+---------+-------+ 
| Field | Type  | Null | Key | Default | Extra | 
+-------+----------+------+-----+---------+-------+ 
| recd | date  | YES |  | NULL |  | 
| id | int(11) | YES |  | NULL |  | 
+-------+----------+------+-----+---------+-------+ 

Currently I have records in the below manner. 


mysql> select * from depot; 
+---------------------+------+ 
| recd    | id | 
+---------------------+------+ 
| 2012-07-09   | 33 | 
| 2012-07-11   | 32 | 
| 2012-07-15   | 32 | 
+---------------------+------+ 
3 rows in set (0.00 sec) 

我需要記錄打印查詢在下面的方式,保持了一個月的日期錯過條目(比如七月01月31日),並具有0到相應錯過日期的id值。

select < a magical query >; 

+------------+------+ 
| recd  | id | 
+------------+------+ 
2012-07-01 0 
2012-07-02 0 
2012-07-03 0 
2012-07-04 0 
2012-07-05 0 
2012-07-06 0 
2012-07-07 0 
2012-07-08 0 
2012-07-09 33 
2012-07-10 0 
2012-07-11 32 
2012-07-12 0 
2012-07-13 0 
2012-07-14 0 
2012-07-15 32 
2012-07-16 0 
2012-07-17 0 
2012-07-18 0 
2012-07-19 0 
2012-07-20 0 
2012-07-21 0 
2012-07-22 0 
2012-07-23 0 
2012-07-24 0 
2012-07-25 0 
2012-07-26 0 
2012-07-27 0 
2012-07-28 0 
2012-07-29 0 
2012-07-30 0 
2012-07-31 0 
+0

那麼,爲什麼你不打印出一個循環中的日期,如果你要檢索所有日期,儘管它們不存在於數據庫中? – feeela 2012-08-09 12:34:07

回答

-1

爲兩個階段查詢:

SELECT @prev := null; 

SELECT datefield, @prev, DATEDIFF(datefield, @prev) AS diff, @prev := datefield 
FROM yourtable 
HAVING diff > 1 
ORDER BY datefield ASC; 

那會檢測到有來自前一行更比1天差日期/日期

0
SELECT 
generated_date, 
COALESCE(yourTable.id, 0) AS id 
FROM 
(
SELECT 
DATE_SUB(CURDATE(), INTERVAL number_days DAY) AS `generated_date` /*<-- Create dates from now back 999 days*/ 
FROM 
(
SELECT (a + 10*b + 100*c) AS number_days FROM 
    (SELECT 0 AS a UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) aa 
, (SELECT 0 AS b UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) bb 
, (SELECT 0 AS c UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) cc 
)sq /*<-- This generates numbers 0 to 999*/ 
) q 
LEFT JOIN yourTable ON DATE(yourTable.datefield) = q.generated_date 
WHERE q.generated_date BETWEEN (SELECT MIN(datefield) FROM yourTable) AND (SELECT MAX(datefield) FROM yourTable) 
ORDER BY q.generated_date ASC 
+0

但我的標準是這樣的:1.它應該以min值開始並以tabe中的最大值結束。 2.它應該包含表格中現有列的字段日期和時間的時間戳列,並且可以在表中缺少日期的任何時間。 – mannoj 2012-08-10 06:23:26

+0

@mannoj查看更新的答案 – fancyPants 2012-08-10 08:14:59

+0

重新構建相同的查詢。 – mannoj 2012-08-10 09:13:49

0

找到解決方法,因爲它很長時間的執着

基準表

CREATE TABLE `deopt` (
    `recd` datetime DEFAULT NULL, 
    `id` int(11) DEFAULT NULL 
) ENGINE=InnoDB; 

種子記錄基表

insert into deopt values ('2012-07-09 23:08:54',22); 
insert into deopt values ('2012-07-11 23:08:54',22); 
insert into deopt values ('2012-07-11 23:08:54',2222); 
insert into deopt values ('2012-07-12 23:08:54',22); 
insert into deopt values ('2012-07-14 23:08:54',245); 

一個月的日期創建一個表

CREATE TABLE seq_dates 
(
    sdate DATETIME NOT NULL, 

); 

創建一個存儲過程,以一個名爲一個月

delimiter // 
DROP PROCEDURE IF EXISTS sp_init_dates; 

CREATE PROCEDURE sp_init_dates (IN p_fdate DATETIME, IN p_tdate DATETIME) 
BEGIN 
DECLARE v_thedate DATETIME; 
TRUNCATE TABLE seq_dates; 
SET v_thedate = p_fdate; 
WHILE (v_thedate <= p_tdate) DO 
    INSERT INTO seq_dates (sdate) 
    VALUES (v_thedate); 
    SET v_thedate = DATE_ADD(v_thedate, INTERVAL 1 DAY); 
END WHILE; 
END; 

delimiter ; 
創建記錄

將起始值和結束值調用7月份的過程爲s進入seq_dates表。

call sp_init_dates ('2012-07-01','2012-07-31'); 

結果的詢問 - 要獲取在一個月內保持0就地空的IDS的所有日期和其對應的ID的記錄。

select date(seq_dates.sdate),coalesce (deopt.id,0) from seq_dates LEFT JOIN deopt ON date(deopt.recd)=date(seq_dates.sdate); 



+-----------------------+-----------------------+ 
| date(seq_dates.sdate) | coalesce (deopt.id,0) | 
+-----------------------+-----------------------+ 
| 2012-07-01   |      0 | 
| 2012-07-02   |      0 | 
| 2012-07-03   |      0 | 
| 2012-07-04   |      0 | 
| 2012-07-05   |      0 | 
| 2012-07-06   |      0 | 
| 2012-07-07   |      0 | 
| 2012-07-08   |      0 | 
| 2012-07-09   |     22 | 
| 2012-07-09   |     22 | 
| 2012-07-10   |      0 | 
| 2012-07-11   |     22 | 
| 2012-07-11   |     2222 | 
| 2012-07-11   |     22 | 
| 2012-07-11   |     2222 | 
| 2012-07-12   |     22 | 
| 2012-07-13   |      0 | 
| 2012-07-14   |     245 | 
| 2012-07-15   |      0 | 
| 2012-07-16   |      0 | 
| 2012-07-17   |      0 | 
| 2012-07-18   |      0 | 
| 2012-07-19   |      0 | 
| 2012-07-20   |      0 | 
| 2012-07-21   |      0 | 
| 2012-07-22   |      0 | 
| 2012-07-23   |      0 | 
| 2012-07-24   |      0 | 
| 2012-07-25   |      0 | 
| 2012-07-26   |      0 | 
| 2012-07-27   |      0 | 
| 2012-07-28   |      0 | 
| 2012-07-29   |      0 | 
| 2012-07-30   |      0 | 
| 2012-07-31   |      0 | 
+-----------------------+-----------------------+ 
35 rows in set (0.00 sec) 
相關問題