【问题标题】:Select records where id does not equal to x选择 id 不等于 x 的记录
【发布时间】:2021-04-02 06:40:02
【问题描述】:

我有这些表

object BooksAuthors : Table(name = "books_authors") {
    val book = reference("book_id", Books, onDelete = ReferenceOption.CASCADE)
    val author = reference("author_id", Authors, onDelete = ReferenceOption.CASCADE)
}

object Books : IntIdTable() {
    val title = varchar("title", 250)
    val isbn = varchar("isbn", 13)
}

object Authors : IntIdTable() {
    val email = varchar("email", 100).uniqueIndex()
}

我想写一个查询,返回所有没有特定作者的书,所以我写了这个

suspend fun getBooksWithoutAuthorId(authorId: Int): List<BookDTO> = DbFactory.dbQuery {
    val query = BooksAuthors.innerJoin(Books).select { BooksAuthors.author neq authorId }
    Book.wrapRows(query).map { it.toDTO() }
}

但是查询返回有作者的书。我做错了什么?

【问题讨论】:

标签: kotlin kotlin-exposed


【解决方案1】:

正如Sebastian Redl 提到的,可能有多个作者的书籍,而您的查询不包括这种情况。

正确的公开查询应该是:

val query = Books.select {
    Books.id notInSubQuery 
            BooksAuthors.slice(BooksAuthors.book).select { BooksAuthors.author eq authorId }
}

【讨论】:

    【解决方案2】:

    看起来您有一个 n:m 映射,其中一本书可以有多个作者。

    您的查询,如所写,查找除您选择的作者之外的作者所创作的任何书籍。

    这意味着如果作者 Alice 和 Bob 一起写了一本书,并且您想查找“不是 Bob 的”书籍,您仍然会找到这本书,因为 Alice 参与了。

    您想要的查询不能表示为简单的连接;你需要嵌套查询。

    类似于这个 SQL 的东西:

    SELECT * from books b WHERE ? NOT IN (
      SELECT ab.author_id FROM authors_books ab WHERE ab.book_id = b.id);
    

    虽然恐怕我不知道如何在 Exposed 中表达这一点。

    https://www.db-fiddle.com/f/7BsVUW95g6L4rXDBCoaXK3/0

    【讨论】:

    • 感谢您这么快回复我!!!!这太棒了,我正在拔头发
    猜你喜欢
    • 1970-01-01
    • 2020-02-13
    • 2019-12-23
    • 1970-01-01
    • 2021-12-13
    • 2013-03-03
    • 2011-06-14
    • 2014-07-10
    • 1970-01-01
    相关资源
    最近更新 更多