从结果中选择不同的某些列

时间:2011-10-20 03:11:58

标签: sql select distinct

假设我有3张桌子:

  1. 作者表(ID,作者姓名)
  2. 流派表(ID,GenreName)
  3. 书籍表(ID,日期,流派,作者)
  4. 其中流派和作者是流派和作者表的外键(ID)。

    我在这里使用:

    Select Books.ID, Books.Date, Genre.GenreName, Author.AuthorName
    From Books, Genre, Author
    Where Books.Genre = Genre.ID
       AND Books.Author = Author.ID
    Order By Books.ID Desc;
    

    得到这个结果:

    | ID |日期|类型|作者|
    ---------------------------------
    | 1 | 4/2/11 |行动| A |
    | 2 | 7/7/11 |恐怖| B |
    | 3 | 18/8/11 |行动| A |
    | 4 | 3/10/11 |喜剧| C |
    | 5 | 16/7/11 |恐怖| D |
    | 6 | 29/7/11 |恐怖| B |
    | 7 | 12/5/11 |喜剧| E |
    | 8 | 13/9/11 |喜剧| C |

    但这不是我需要的实际结果。

    任何人都可以帮我查看不同的Column Genre和书籍作者的选择查询以及最新日期以获得此结果吗?


    | ID |日期|类型|作者|
    ---------------------------------
    | 3 | 18/8/11 |行动| A |
    | 4 | 3/10/11 |喜剧| C |
    | 5 | 16/7/11 |恐怖| D |
    | 6 | 29/7/11 |恐怖| B |
    | 7 | 12/5/11 |喜剧| E |

2 个答案:

答案 0 :(得分:0)

通过假设作者姓名/流派名称可以相同,我有点安全,因此它使用ID来定位最大日期子选择记录的相应记录。

Select
books.id
, MaxDates.MaxDate
, Genre.GenreName
, Author.AuthorName 
from books
inner join Genre on Books.Genre=Genre.ID 
inner join Author on Books.Author=Author.ID 
inner join
(
  Select 
  max(Books.Date) as MaxDate
  , Genre as GenreID
  , Author as AuthorID
  From Books
  group by Books.Genre, Books.Author
) maxDates on Author.ID = MaxDates.AuthorID and Genre.ID = MaxDates.GenreID and Books.Date = MaxDates.MaxDate
Order By Books.ID Desc;

子查询获取每个流派/作者组合的最大日期列表,然后将其与原始书籍记录匹配以获取原始记录中的书籍ID。你需要这样做,因为你不能只是最大id和最大日期,并假设最大值来自同一行。

答案 1 :(得分:0)

我终于找到了错误!只需在安德鲁的回答中进行编辑。 这是我目前获得结果的语法:

Select Books.ID, MaxDates.MaxDate, Genre.GenreName, Author.AuthorName
from (( Books INNER JOIN Genre ON Books.Genre=Genre.ID) inner join 
Author ON Books.Author=Author.ID)
INNER JOIN (Select Max(Books.BookDate) as MaxDate
  From Books
  group by Books.Genre, Books.Author) MaxDates 
on Books.BookDate = MaxDates.MaxDate
Order By Books.ID Asc;

非常感谢安德鲁! XD