2015-02-23 86 views
0

我做了一个视图(加入四个表)最新的记录如下图所示:MySQL查询用于获取独特和

ID | BookID | date | points | 
1 | 11 | 2014-11-01 | 15 | 
1 | 11 | 2015-01-01 | 16 | 
1 | 11 | 2014-12-01 | 17 | 
1 | 12 | 2014-02-11 | 18 | 
1 | 12 | 2014-03-11 | 19 | 
1 | 12 | 2014-04-11 | 15 | 
1 | 13 | 2014-12-23 | 121 | 
1 | 14 | 2014-01-15 | 113 | 
1 | 14 | 2014-02-08 | 112 | 

我想这个观点的结果如下

ID | BookID | Date  | points | 
1 | 11 | 2015-01-01 | 16 | 
1 | 12 | 2014-04-11 | 15 | 
1 | 13 | 2014-12-23 | 121 | 
1 | 14 | 2014-02-08 | 112 | 

它应该是比如带有最大日期并显示为分离点的Distincit Book ID。 到目前为止,我已经通过加入并按日期分组来尝试该组。但由于我无法找到解决方案,它正在逐渐过去。

我的查询是:

SELECT m1.* FROM viewPoints m1 LEFT JOIN viewPoints m2 
ON (m1.BookID = m2.BookID AND m1.Date < m2.Date) 
WHERE m1.ID= 1 and m2.Date IS NULL 

ORDER BY m1.BookID 

任何帮助!提前致谢。

+0

也分享你的查询,这样我们就可以知道表结构 – 2015-02-23 11:00:19

+0

可能会发现在[这个如此答问]您的解决方案(HTTP:/ /stackoverflow.com/a/612268/1720332) – JBA 2015-02-23 11:02:35

+0

@MONTS_MIND_Hacker我编辑了我的问题。 – DDay 2015-02-23 11:03:56

回答

1

也许这是你想要的吗?

select v.* 
from viewPoints v 
join (
    select 
     BookID, 
     max(date) max_date 
    from viewPoints 
    where points is not null 
    group by BookID 
) v2 on v.BookID = v2.BookID and v.date = v2.max_date 
where v.points is not null 
order by v.BookID 

Sample SQL Fiddle

输出示例:

| ID | BOOKID |       DATE | POINTS | 
|----|--------|---------------------------------|--------| 
| 1 |  11 | January, 01 2015 00:00:00+0000 |  16 | 
| 1 |  12 | April, 11 2014 00:00:00+0000 |  15 | 
| 1 |  13 | December, 23 2014 00:00:00+0000 | 121 | 
| 1 |  14 | February, 08 2014 00:00:00+0000 | 112 | 
+0

我得到重复的bookID,其中的点为空。我不想。我错过了什么?有什么问题?完全用尽了这个小问题:( – DDay 2015-02-23 11:39:12

+0

@DDay不确定你的意思,因为你的示例数据中没有空值;在任何情况下,都应该从结果中排除所有带有空值的行(从where子句中你可能会添加一些产生错误的示例数据吗? – jpw 2015-02-23 11:41:30

+0

@DDay我想我现在明白你的问题了;如果有其他BookID与最大日期相同的日期,但它们也被包含在内,已经改变了查询,现在排除他们。 – jpw 2015-02-23 12:02:26

0
CREATE VIEW [BOOKLIST] AS 
SELECT m1.* FROM viewPoints m1 LEFT JOIN viewPoints m2 
ON (m1.BookID = m2.BookID AND m1.Date < m2.Date) 
WHERE m1.ID= 1 and m2.Date IS NULL 
ORDER BY m1.BookID  

SELECT ID, DISTINCT BookID, Date, points FROM BOOKLIST 
WHERE Date BETWEEN "start date" AND "end date" 
+0

我不知道日期之间,也是我通过给硬编码的日期尝试过。它不起作用。 – DDay 2015-02-23 11:13:05

0
SELECT * 
FROM tablename 
    WHERE DATE 
IN (

    SELECT MAX(DATE) 
    FROM tablename 
    GROUP BY bookid 
    ORDER BY DATE DESC 
) 
ORDER BY DATE DESC 
+0

它选择所有日期的所有书籍。不知道你是否理解这个问题。还没有找到任何解决方案。 – DDay 2015-02-23 11:18:17

+0

http://www.sqlfiddle.com/#!2/1572a7/1请参阅sql小提琴它工作正常。 – 2015-02-23 11:24:59