sql >> データベース >  >> RDS >> Mysql

検索結果をランク付けするためのSQLのヘルプが必要

    私は上記の問題に対する実用的な解決策を見つけました。他の誰かが同様の問題を経験した場合に備えて、ここに投稿しています。

    解決策は、caseステートメントの代わりに副選択を使用することです。これが修正された上記のコードのダイブです。 (これが最善の解決策なのか、最も効率的な解決策なのかはわかりませんが、当面は問題が解決し、検索結果がかなり迅速に返されるようです。)

    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. Laravelの画面にSQLクエリをダンプする

    2. 右側のテーブルからの結果が空の内部結合

    3. 32ビットExcelおよび64ビットSQLServer

    4. PostgreSQL9.3でのスイッチオーバー/スイッチバックの実装。