gpt4 book ai didi

mysql - Rails - JOIN 子句不包含具有空外键的行

转载 作者:太空宇宙 更新时间:2023-11-03 12:05:39 25 4
gpt4 key购买 nike

假设我有这个数据(注意第三本书中的空 author_id):

     Authors
-------------------------
id | name
-------------------------
1 | Susan Collins
2 | Steven Meyer
-------------------------

Books
--------------------------------------
id | author_id | title
--------------------------------------
1 | 1 | Hunger Games
2 | 2 | Twilight
3 | nil | Games of Throne
--------------------------------------

我有一个图书搜索栏。我希望它可以通过书名和作者姓名进行搜索。

例如,当我搜索“Susan”时。它将返回标题为“Susan”或作者姓名为“Susan”的书籍。

问题是:当我搜索“游戏”时,它只返回“饥饿游戏”。它不会选择“权力的游戏”,因为 author_id 为空。

我制作了 SQLFiddle在这里。

这是从我的 Rails 代码生成的 SQL:

SELECT books.* FROM books
INNER JOIN authors ON authors.id = books.author_id
WHERE (
( LOWER(books.title) LIKE LOWER("%game%") )
OR
( LOWER(authors.name) LIKE LOWER("%game%") )
)

结果 只返回 1 行:“Hunger Games”。没有“权力的游戏”。

有没有办法包含带有空外键的行?

我会接受 SQL 查询作为答案,我会尝试自己找出 Rails 代码。

谢谢

[编辑]

这是生成 SQL 的 Rails 代码:(我使用 Squeel gem)

search = "%#{params[:search]}%" # the query is taken from param

Books.joins(:author).where {
( lower(title) =~ lower(search) ) |
( lower(author.name) =~ lower(search) )
}

最佳答案

你想要的是 LEFT JOIN 而不是 INNER JOIN : http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

在您的 Sql Fiddle 中将 left 替换为 inner,您将获得有作者和无作者的书籍。

在 Rails 中,您可以通过将 joins 替换为 includes 来实现左连接。因为它保留第一个表中没有关系的数据,所以当你想预先加载关系以防止 N+1 查询问题时经常使用它。

关于mysql - Rails - JOIN 子句不包含具有空外键的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26732191/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com