sql >> Databasteknik >  >> RDS >> Mysql

Behöver hjälp med SQL för att rangordna sökresultat

Jag har hittat en fungerande lösning på ovanstående problem och lägger upp den här, ifall någon annan upplever ett liknande problem.

Lösningen är att använda en sub-select, istället för en case statement. Här är ovanstående avledning av kod, korrigerad. (Jag vet inte om det här är den bästa eller mest effektiva lösningen, men det har löst problemet för mig för närvarande och verkar ge sökresultat ganska snabbt.)

SELECT 
    exercises.ID AS ID,
    exercises.title AS title, 
    (
        (
            SELECT COUNT(1) 
            FROM searchtags 
            LEFT JOIN exerciseSearchtags 
            ON exerciseSearchtags.searchtagID = searchtags.ID 
            WHERE searchtags.title LIKE CONCAT('%',?,'%') 
            AND exerciseSearchtags.exerciseID = exercises.ID
        )+
        (
            SELECT COUNT(1) 
            FROM searchtags 
            LEFT JOIN exerciseSearchtags 
            ON exerciseSearchtags.searchtagID = searchtags.ID 
            WHERE searchtags.title LIKE CONCAT('%',?,'%') 
            AND exerciseSearchtags.exerciseID = exercises.ID
        )+
        ...etc...
        (
            SELECT COUNT(1) 
            FROM searchtags 
            LEFT JOIN exerciseSearchtags 
            ON exerciseSearchtags.searchtagID = searchtags.ID 
            WHERE searchtags.title LIKE CONCAT('%',?,'%') 
            AND exerciseSearchtags.exerciseID = exercises.ID
        )
    ) AS relevance

FROM 
    exercises

LEFT JOIN exerciseSearchtags
    ON exerciseSearchtags.exerciseID = exercises.ID 

LEFT JOIN searchtags
    ON searchtags.ID = exerciseSearchtags.searchtagID

WHERE
    searchtags.title LIKE CONCAT('%',?,'%') OR
    searchtags.title LIKE CONCAT('%',?,'%') OR
    ...etc...
    searchtags.title LIKE CONCAT('%',?,'%') 

GROUP BY 
    exercises.ID                

ORDER BY 
    relevance DESC


  1. SQL:Sortera efter prioritet, men sätt 0 sist

  2. IntegrityError:skiljer mellan unika restriktioner och inte null-överträdelser

  3. datumformat i node.JS

  4. Laravel 5 vältalig vari