ЛЕВОЕ СОЕДИНЕНИЕ строки

На части моего сайта пользователи вводят несколько условий поиска. Каждое из этих условий поиска может возвращать 0 строк или возвращать несколько. Я выполняю UNION для всех поисков и получаю строки.

Для меня все намного проще, если я могу получить все условия поиска в ответе, независимо от того, возвращают ли они какие-либо строки. Есть ли способ по существу LEFT JOIN строки (в данном случае поискового запроса) в запросе SELECT?

Обновление дополнительной информации:

У меня есть таблица Books с полем Title.

Пользователь вводит до 10 title search_terms, и в настоящее время я выполняю UNION для всех из них, чтобы получить совпадающие строки. Так что это как

SELECT $s[0] AS Search_Term,* WHERE Title LIKE '%$s[0]%'  UNION 
SELECT $s[1] AS Search_Term,* WHERE Title LIKE '%$s[1]%' ...etc

Я бы хотел, чтобы при отсутствии результатов для данного поиска я все равно возвращал Search_Term вместе с заголовком NULL.


person bgcode    schedule 10.08.2010    source источник


Ответы (3)


Вы можете использовать полнотекстовый поиск (FTS) таким образом, если вы объедините значения массива вместе:

   SELECT x.searchterm,
          b.*
     FROM (SELECT $s[0 ... 20] AS search_term) x
LEFT JOIN BOOKS b ON MATCHES(b.title) AGAINST (x.searchterm)

$s[0 ... 20] — это местозаполнитель для условий поиска, объединенных в одну строку, в которой каждый термин отделяется пробелом.

LEFT JOIN гарантирует, что вы получите свой поисковый запрос и NULL для остальных столбцов, если ничего не совпадает.

person OMG Ponies    schedule 10.08.2010

Я думаю, это то, что он хочет:

--Полученные результаты--

Search Term____Title________________________________Author______Call No
cats           How to Care for Millions of Cats     JohnB       B.342
kittens        Why Kittens are your only Friends    Old Lady    L.4239
rabies         null                                 null        null

etc.

Может быть, что-то вроде этого:

SELECT
  CASE count
    count > 0
      'Search Term', books.title 'Title', books.author 'Author', books.call_no 'Call No'
    count <= 0
      'Search term 1'
  END CASE
FROM
  (SELECT COUNT('Search term 1') count, 'Search term 1' 'Search Term' ,*
   FROM books
   WHERE books.title LIKE 'Search term 1');

(однако вам придется устранить перегибы)

person JohnB    schedule 10.08.2010
comment
Я хочу, чтобы поисковый запрос отображался в результатах, даже если fact.description != поисковый запрос - person bgcode; 10.08.2010
comment
@babonk, не нужно голосовать против, я пытаюсь помочь! Вы почти не предоставили никаких подробностей; ваш вопрос был расплывчатым!! - person JohnB; 10.08.2010
comment
@JohnB: я добавил больше информации о запросе и т. Д. Извините за расплывчатый вопрос. - person bgcode; 10.08.2010
comment
Спасибо JohnB (это действительно то, к чему я иду). Есть ли способ сократить его, как запрос OMG Ponies? - person bgcode; 10.08.2010
comment
Извини, бабонк, OMG Ponies далеко не мой уровень! Воспользуйтесь его запросом! +1 ОМГ - person JohnB; 10.08.2010
comment
хорошо, сойдет .. спасибо за ответ, хотя .. я только проголосовал против, потому что в прошлом люди игнорировали мои вопросы, потому что там есть вопрос, который не отвечает на него. (убрал минус) - person bgcode; 10.08.2010

Условия присоединения работают так же, как условия WHERE, вы можете использовать «LIKE» или «=», чтобы присоединиться к выбранному вами условию. Если вам нужна дополнительная информация, мне понадобятся примеры запросов и определения таблиц.

person MPelletier    schedule 10.08.2010