2017-10-13 7 views
0

Je cherchais un "pourquoi" à cela. Dans cette requête j'essaie de montrer les résultats mais auparavant je fais une comparaison d'un champ URL d'une table et du champ URL d'une autre table (j'utilise CONCAT parce que les URL ne sont pas exactement les mêmes) mais quand j'essaye d'ajouter "Ordre par ..." l'instruction prend beaucoup de temps pour répondre jusqu'à ce que le serveur coupe ma connexion.Mysql - "Ordre par" ne fonctionne pas en utilisant "CONCAT"

SELECT id, url, title MATCH(title, tags, category) AGAINST('white dogs') as score 
FROM Items 
LEFT JOIN Deleted_Items 
ON Deleted_Items.url LIKE CONCAT(Items.url , '%') 
WHERE Deleted_Items.url IS NULL 
AND MATCH(title, tags, category) AGAINST('white dogs' IN BOOLEAN MODE) 
ORDER BY score DESC 
LIMIT 30 
+0

Vous devez référencer la table sur votre sélection, sinon elle interprétera comme dupliquée et cherchera pour toujours jusqu'à expiration –

+0

J'ai fait le test en ajoutant le nom de la table à chaque colonne mais le résultat était le même (Items. *) – Kokox

Répondre

1

La condition de jointure qui emploie CONCAT() n'est pas sargable et donc intrinsèquement inefficace, plus le tri sur un calcul. Peut-être l'aider le long en persistant les données à une table temporaire par exemple.

INSERT INTO some_temp_tbl_name (id, url, title, tags, category) 
SELECT i.id, i.url, i.title, i.tags, i.category 
FROM Items i 
LEFT JOIN Deleted_Items d ON d.url LIKE CONCAT(i.url , '%') 
WHERE d.url IS NULL 

Effectuez ensuite la correspondance et l'ordre à partir de cette table.