2012-08-07 114 views
2

我在數據庫中有一些記錄。現在我想從最新wise.Please看到我的桌子的下面格式的記錄..從日期獲取數據

User_id name date   Present 
    001  Jone 01-08-2012  yes 
    002  arun 01-08-2012  yes 
    001  Jone 02-08-2012  yes 
    002  arun 02-08-2012  yes 
    001  Jone 03-08-2012  yes 
    001  Jone 04-08-2012  yes 
    002  arun 05-08-2012  yes 
    001  Jone 05-08-2012  yes 
    001  Jone 06-08-2012  yes 
    001  arun 06-08-2012  yes 

我希望得到「阿朗」從2012-08-01到2012年7月8日這樣

報告
User_id name date   Present 
    002  arun 01-08-2012  yes 
    002  arun 02-08-2012  yes 
    002  arun 03-08-2012  
    002  arun 04-08-2012  
    002  arun 06-08-2012  yes 
    002  arun 07-08-2012  

請幫我看看這個報告。是新的MySQL ..

+0

你怎麼'07 -08-2012' 此日期輸出? – Omesh 2012-08-07 06:52:22

+0

這是一個非常好的問題。我錯過了,當我寫我的查詢。是否有列出所有日期的日期表?如果不是,你使用的是哪個數據庫? – 2012-08-07 07:07:00

回答

1

爲了顯示丟失的日期,你需要一個臨時表。 臨時表:

CREATE TABLE numbers (number INTEGER); 
INSERT INTO numbers VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); 

SQL如下:

SELECT CASE WHEN u.id IS NOT NULL 
     THEN u.id 
     ELSE u2.id 
END AS id , 
CASE WHEN u.name IS NOT NULL 
     THEN u.name 
     ELSE u2.name 
END AS name , 
cal.date, 
CASE WHEN u.present IS NOT NULL 
     THEN u.present 
     ELSE '' 
END AS present 
FROM (
    SELECT '2012-08-01' + INTERVAL a.number * 10 + b.number DAY as date 
    FROM numbers a JOIN numbers b 
    ORDER BY a.number * 10 + b.number 
) cal LEFT JOIN (select * from users where name='arun') u 
ON DATE_FORMAT(STR_TO_DATE(u.date1, '%d-%m-%Y'), '%Y-%m-%d') = cal.date 
left join (select id,name from users group by id)u2 on u.id is null and u2.name='arun' 
WHERE date BETWEEN '2012-08-01' AND '2012-08-07'; 

SQL DEMO HERE.

+0

非常感謝。..它的工作正常... – 2012-08-07 10:51:32

0

我認爲這是你在找什麼:

SELECT User_id, name, `date`, 
     IF(MAX(Present) = 1, 'yes', 'no') AS Present 
FROM 
(
SELECT User_id, name, `date`, IF('yes', 1, 0) Present 
FROM table_name 
WHERE `date` BETWEEN '2012-08-01' AND '2012-08-07' AND 
     name = 'arun' 

UNION ALL 

SELECT '002' AS User_id, 'arun' AS name, a.`date`, 0 AS Present 
FROM (
     SELECT CURDATE() - INTERVAL (a.a + (10 * b.a) + (100 * c.a)) DAY AS date 
     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) AS a 
     CROSS JOIN (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) AS b 
     CROSS JOIN (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) AS c 
     ) a 
WHERE a.date BETWEEN '2012-06-05' AND '2012-06-20'; 
) a 
GROUP BY name, `date` 
ORDER BY `date` ASC; 
+0

你忘了指定'User_id'或'name'專用於'arun'。 – DavidS 2012-08-07 06:33:25

+0

這不會填補缺失的日期。 – 2012-08-07 06:49:43

+0

我想要失蹤的日期也.. – 2012-08-07 07:27:05

0
select * from (

    select id, name, date, present 
     FROM your_table 
    WHERE your_table.name = 'arun' 
    union all 
    select (select id from your_table where name = 'arun'), 'arun', all_dates.date, '' 
     from (select distinct date from your_table where your_table.name != 'arun') 
     left join your_table 
     ON all_dates.date = your_table.date 
     AND your_table.name = 'arun' 
    WHERE your_table.id IS NULL 

) subquery 
order by date desc 
where date between '01-08-2012' and '07-08-2012' 
+0

我得到了錯誤「無法重新打開表格:temp_table」 – 2012-08-07 07:37:07