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

MySQLの複数IDルックアップ

    MySQL ビューにインデックスを付けることができないため、MySQLでは必要なことは不可能です 。

    Sphinxなどの外部フルテキストインデックスエンジンを使用し、JOINSを使用したクエリを使用してそこにデータを読み込むことができます。

    または、非正規化されたテーブルを作成することもできます:

    CREATE TABLE ftsearch
            (
            teacherId INT PRIMARY KEY,
            teacherBiography TEXT,
            subject1 TEXT,
            subject2 TEXT,
            subject3 TEXT,
            )
    ENGINE=MyISAM
    

    次のクエリで入力します:

    INSERT
    INTO    ftsearch
    SELECT  teacherId, teacherBiography,
            s1.name, s2.name, s3.name
    FROM    teacherProfile
    LEFT JOIN
            subject s1
    ON      s1.id = subjectOneId 
    LEFT JOIN
            subject s2
    ON      s2.id = subjectTwoId 
    LEFT JOIN
            subject s3
    ON      s3.id = subjectThreeId 
    

    タイムリーに。

    実際、すべてのテーブルがMyISAMの場合 、全文インデックスを作成しなくても、(ブールモードで)全文検索クエリを結合に適用できます。

    たとえば、'+Jones +math +physics'を検索している場合 、ここでJones は教師の名前であり、math およびphysics サブジェクトである場合は、次のクエリを実行できます:

    SELECT  teacherId, teacherBiography,
            s1.name, s2.name, s3.name
    FROM    teacherProfile
    LEFT JOIN
            subject s1
    ON      s1.id = subjectOneId 
    LEFT JOIN
            subject s2
    ON      s2.id = subjectTwoId 
    LEFT JOIN
            subject s3
    ON      s3.id = subjectThreeId 
    WHERE   MATCH(teacherBiography) AGAINST ('+Jones' IN BOOLEAN MODE)
            AND MATCH(t.teacherBiography, s1.name, s2.name, s3.name) AGAINST ('+Jones +math +physics' IN BOOLEAN MODE)
    

    MATCH(teacherBiography) AGAINST ('+Jones') FULLTEXTを使用します teacherのインデックス 、もしあれば; 2番目のMATCH 結果を細かくフィルタリングします。

    ORを含むクエリ ただし、条件または関連性の並べ替えはより複雑です。




    1. MySQL COUNT DISTINCT

    2. PyMySQLはローカルホスト上のMySQLに接続できません

    3. PostgreSQLでのNull値のインデックス作成

    4. SQLインジェクション攻撃-これは何をしますか?