2010-06-11 4 views
1

J'ai essayé de trouver quelque chose pendant un moment maintenant sans succès. Mes connaissances MySQL sont au mieux rudimentaires, donc je pourrais utiliser quelques conseils sur ce que je devrais utiliser pour ce qui suit:Aide MySQL avancée de recherche

J'ai 2 tables ('bible' et 'livres') dont j'ai besoin de chercher. En ce moment, je recherche juste « bible » avec la requête suivante:

SELECT * 
    FROM bible 
WHERE text LIKE '%" . $query . "%' 
ORDER BY likes DESC 
    LIMIT $start, 10 

Maintenant, je dois ajouter une autre partie qui recherche des trucs assez avancé. Voici ce que je veux faire dans pseudocode que je suis au courant ne fonctionne pas:

SELECT * 
    FROM bible 
WHERE books.book+' '+bible.chapter+':'+bible.verse = '$query' 

$ query serait égale à quelque chose comme la Genèse 1: 2, Genesis provenant books.book, 1 provenant bible.chapter et 2 provenant bible.verse

Toute aide/conseils sur ce qui est beaucoup apprécié =)

+0

Pls mettre à jour votre question avec la sortie que vous obtenez de courir: 'DESC bible' –

Répondre

0

Vous devez analyser la requête en livre, le chapitre et le verset en php premier.

Une expression régulière devrait fonctionner:

preg_match("/(.+)([0-9]+):([0-9]+)/",$query,$matches); 
$book = trim(matches[1]); // use trim to remove extra spaces 
$chapter = matches[2]; 
$verse = matches[3]; 

Ensuite, votre requête SQL devient:

SELECT * FROM bible WHERE books.book = '$book' AND bible.chapter= '$chapter' AND bible.verse ='$verse' -- watch out for sql injection here! use prepared statements!

+0

' rtrim (ltrim ($ s)) '=' trim ($ s) '? Et aucune raison de 'couper()' ce '([0-9] +)' match, je suppose :) – jensgram

+0

@jensgram - correct. fixé. –

+0

Aussi, le. dans le premier sous-motif est gourmand, donc il va manger après tout. Vous pouvez soit '\ w +' si vous voulez seulement des lettres, soit '. *?' Pour une correspondance non conforme ... – ircmaxell

0

Vous êtes proche. Pour concaténer les champs utilisent la fonction CONCAT():

SELECT * FROM bible WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query' 
0

Vous pouvez utiliser MySQL concatenation:

SELECT * 
FROM bible JOIN books 
WHERE CONCAT(books.book, ' ', bible.chapter, ':', bible.verse) = '$query' 

Je ne suis pas sûr de ce que votre clé étrangère relie des livres à la Bible, mais qui peut avoir besoin spécification ainsi que.

+2

Cela devrait être la toute dernière option –

3

Je vous recommande de concevoir un moyen dans votre code d'application pour diviser cette requête afin que vous puissiez rechercher le livre, le chapitre et le couplet séparément du mot-clé. Cela signifie que vous avez besoin de colonnes pour le livre, le chapitre et le verset qui sont séparées du texte du verset.

Vous devez également utiliser un FULLTEXT index car les recherches de caractères génériques LIKE sont extremely inefficient.

Voilà comment je courrais la requête en PHP en utilisant PDO:

$quoted_query = $pdo->quote($query); 
$sql = "SELECT * FROM bible 
     WHERE book = ? AND chapter = ? AND verse = ? 
      AND MATCH(text) AGAINST ({$quoted_query})" 
$stmt = $pdo->prepare($sql); 
$stmt->execute(array($book, $chapter, $verse)); 

Je préfère utiliser un paramètre pour la requête texte intégral aussi, mais MySQL ne supporte pas.