2010-08-10 10 views
1

Sur une partie de mon site, les utilisateurs saisissent plusieurs termes de recherche. Chacun de ces termes de recherche peut renvoyer 0 ligne ou renvoyer plusieurs lignes. J'effectue UNION sur toutes les recherches et récupère les lignes.LEFT JOIN d'une chaîne

Il m'est beaucoup plus facile d'obtenir tous les termes de recherche dans la réponse, qu'ils retournent des lignes ou non. Existe-t-il un moyen de joindre LEFT JOIN essentiellement une chaîne (dans ce cas le terme de recherche) à une requête SELECT?

Plus d'information mise à jour:

J'ai une table Livres avec le titre sur le terrain.

L'utilisateur saisit jusqu'à 10 titres search_terms, et j'effectue actuellement un UNION sur tous ces éléments pour obtenir des lignes correspondantes. Il est donc comme

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

Je voudrais pour que s'il n'y a pas de résultats pour une recherche donnée, je reçois toujours le terme_recherche retour avec le titre NULL.

Répondre

1

Vous pouvez utiliser la recherche de texte intégral (FTS) De cette façon, si vous concaténer les valeurs du tableau ensemble:

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] est un espace réservé pour les termes de recherche concaténées en une seule chaîne, en séparant chaque terme avec un caractère de l'espace. LEFT JOIN s'assurera que vous obtenez votre terme de recherche et NULL pour le reste des colonnes si rien ne correspond.

4

Je pense que c'est ce qu'il veut:

--Results--

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. 

Peut-être quelque chose comme ceci:

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'); 

(vous aurez à travailler les petits défauts out though)

+0

Je veux le terme de recherche dans les résultats, même si facts.description! = Le terme de recherche – babonk

+2

@babonk, pas besoin de voter vers le bas, je suis en train d'aider! Vous avez à peine fourni des détails; ta question était vague !! – JohnB

+0

@JohnB: J'ai ajouté plus d'informations sur la requête, etc. Désolé pour la question étant vague – babonk

0

Les conditions de jointure fonctionnent comme dans les conditions WHERE, vous pouvez utiliser " LIKE "or" = "se joindre à la condition de votre choix. Si vous avez besoin de plus de détails, j'ai besoin d'exemples de requêtes et de définitions de tables.

+0

J'ai ajouté plus d'informations à la question .. – babonk