Допустим, у меня есть эти данные (обратите внимание на нуль 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
--------------------------------------
У меня есть панель поиска для книг. Я хочу, чтобы его можно было найти по названию книги и имени автора.
Например, когда я ищу «Сьюзан». Он будет возвращать книги с названием «Сьюзан» или автором по имени, например «Сьюзен».
Проблема в том: когда я ищу "Игра", я получаю только "Голодные игры". Он не выбирает «Игру престолов», потому что author_id
равно нулю.
Я сделал SQLFiddle здесь.
Это SQL, сгенерированный из моего кода Rails:
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 строку: "Голодные игры". Никакой «Игры престолов».
Есть ли способ включить строку с нулевым внешним ключом?
Я приму SQL-запрос в качестве ответа, я попытаюсь сам разобраться в коде Rails.
Спасибо
[РЕДАКТИРОВАТЬ]
Вот код Rails, который генерирует SQL: (я использую гем Squeel)
search = "%#{params[:search]}%" # the query is taken from param
Books.joins(:author).where {
( lower(title) =~ lower(search) ) |
( lower(author.name) =~ lower(search) )
}
LOWER
, так что регистр не имеет значения. Результат SQL просто возвращает «Голодные игры». добавлю в редакцию - person hrsetyono   schedule 04.11.2014