【问题标题】:Select Distinct Certain Columns From Result从结果中选择不同的某些列
【发布时间】:2011-10-20 03:11:58
【问题描述】:

假设我有 3 张桌子:

  1. 作者表(ID、作者名)
  2. 流派表(ID、流派名称)
  3. 图书表(ID、日期、流派、作者)

其中 Genre 和 Author 是 Genre 和 Author 表的外键 (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;

得到这个结果:

|身份证 |日期 |类型 |作者 |
---------------------------------
| 1 | 2011 年 4 月 2 日 |行动 |一个 |
| 2 | 2011 年 7 月 7 日 |恐怖 |乙|
| 3 | 11 年 8 月 18 日 |行动 |一个 |
| 4 | 2011 年 3 月 10 日 |喜剧| C |
| 5 | 2011 年 16 月 7 日 |恐怖 | D |
| 6 | 29/7/11 |恐怖 |乙|
| 7 | 2011 年 12 月 5 日 |喜剧| E |
| 8 | 2011 年 13 月 9 日 |喜剧| C |

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

谁能帮我选择查询以区分书籍中的列类型和作者以及获得以下结果的最后日期?


|身份证 |日期 |类型 |作者 |
---------------------------------
| 3 | 11 年 8 月 18 日 |行动 |一个 |
| 4 | 2011 年 3 月 10 日 |喜剧| C |
| 5 | 2011 年 16 月 7 日 |恐怖 | D |
| 6 | 29/7/11 |恐怖 |乙|
| 7 | 2011 年 12 月 5 日 |喜剧| E |

【问题讨论】:

    标签: sql select distinct


    【解决方案1】:

    假设作者姓名/流派名称可能相同,我有点安全,因此它使用 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 和最大日期并假设最大值来自同一行。

    【讨论】:

    • 我认为您不需要子查询中的INNER JOINs。您可以只使用流派和作者 ID,因为它们已经在 Books 表中。
    • 是的,我从模板中将它们放在了那里,但它们不需要,将它们编辑掉
    • 非常感谢大家!但是我收到这样的错误消息:
    • an error like?... 我刚刚注意到我的 sql 中有一个额外的逗号已删除,因为我没有要测试的表,代码可能需要一些小的调整,但它是如何工作的想法很好
    • 查询表达式中的语法错误(缺少运算符)'Books.Genre=Genre.ID INNER JOIN Author ON Books.Author=Author.ID INNER JOIN (Select Max(Books.BookDate) as MaxDate, Genre as GenreID, Author as AuthorID From Books GROUP BY Books.Genre, Books.Author) MaxDates ON Author.ID=MaxDates.AuthorI' 额外的逗号没关系 :D 而且我也将“日期”列更改为“BookDate”以避免错误。现在我不知道这个错误来自哪里...... #__# 对不起,伙计们......
    【解决方案2】:

    我终于找到了错误!只是从安德鲁的回答中到处编辑。 这是我当前获取结果的语法:

    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;
    

    非常感谢安德鲁!呵呵

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      • 2021-12-17
      • 2019-04-18
      • 2022-06-14
      • 1970-01-01
      • 2016-05-14
      • 1970-01-01
      相关资源
      最近更新 更多