【问题标题】:show repeated column value only once仅显示重复的列值一次
【发布时间】:2016-05-08 07:46:20
【问题描述】:

这里我只为我的课程做一个图书馆管理项目。我目前有三个表

(书籍,作者,book_authors)

booksauthors 之间有多对多关系,book_author 是一个中间表

这是我的 book_author 表。在这里你可以看到 id=1 的书是由两位作者写的。我愿意做的是每当我拿那本书时,我希望书名只重复一次。

我正在使用以下查询来获取书名和作者姓名

SELECT  DISTINCT books.title, authors.author_name FROM (books INNER JOIN book_author ON books.ID=book_author.book_id ) INNER JOIN authors ON authors.ID=book_author.author_id WHERE books.ID=1

结果如下。这里的标题重复了两次,这很明显。但我只想重复一次标题,但也要显示两个作者姓名。我怎么能做到这一点?

【问题讨论】:

  • 您打算如何向您的用户展示这些数据?
  • 我希望标题只显示一次,但两位作者都会显示。否则用户可能会认为它们是来自具有相似名称的两个不同作者的两本不同的书
  • 数据显示问题最好在表示层解决,如果可用的话,例如PHP(或者可能是 ASP 或 VB)中的一个简单循环
  • 另外,请注意此表中的 ID 列没有任何作用。
  • 使用此 SELECT 您会收到不同的书籍和作者组合。此外:除非将它们组合在一个函数中,通常是一个 UDF,否则您永远不会从两行中获取数据。

标签: mysql sql vb.net ms-access


【解决方案1】:

您将不得不使用一些用户定义函数 (UDF)。在 Access VBA 中:

Public Function ConcatFields(TblName as String, FieldName as String, Optional Condition As String = "") As String
    Dim rst as Dao.Recorset, StrSQL as String
    StrSQL = "SELECT " & FieldName  & " FROM " & TblName  
    IF Len(Condition) > 0 Then
        StrSQL = StrSQL & " WHERE " & Condition 
    End if
    Set rst = CurrentDb.OpenRecordset (StrSQL )
    Do While Not rst.Eof
        ConcatFields = ConcatFields & rst.Fields(FieldName ) & ", "
    rst.MoveNext: Loop
    IF Right(ConcatFields, Len(", ") = ", ") Then 
         ConcatFields = Left(ConcatFields, Len(ConcatFields) -  Len(", "))
    End If
End Function

这是你的 SQL:

SELECT books.title, ConcatFields('book_author INNER JOIN authors ON authors.ID=book_author.author_id', 'authors.author_name', 'book_author.book_id = ' & books.ID)
FROM books

【讨论】:

    【解决方案2】:

    尝试使用GROUP BY

    问候, 安德烈

    【讨论】:

    • 这里我没有使用任何聚合函数。我如何使用 group by here
    • 通过在author_name 上添加MINGROUP_CONCAT
    • 如果您只想提出提示,请使用评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-03-24
    • 1970-01-01
    • 2020-12-29
    相关资源
    最近更新 更多