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

2つの結果セット間の類似性を比較する

    このようなもの:

    SELECT first_user.id_user, second_user.id_user, COUNT(first_user.id_user) AS total_matches
    
    FROM likes AS first_user
    
    JOIN likes AS second_user
    ON second_user.id_artist = first_user.id_artist
    AND second_user.id_user != first_user.id_user
    
    GROUP BY first_user.id_user, second_user.id_user
    
    ORDER BY total_matches DESC
    
    LIMIT 1
    

    これはあまり効率的ではないことに注意してください。これを回避する1つの方法は、LIMIT 1を使用してこのクエリの出力を含む「キャッシュテーブル」を作成することです。 一部を削除しました。関連するインデックスをいくつか追加し、このキャッシュテーブルをクエリします。このテーブルを定期的に更新するようにcronジョブを設定できます。

    例:

    CREATE TABLE IF NOT EXISTS `likes` (
      `id_user` varchar(50) DEFAULT NULL,
      `id_artist` varchar(50) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
    
    INSERT INTO `likes` (`id_user`, `id_artist`) VALUES ('8', '39'), ('8', '37'), ('4', '37'), ('8', '24'), ('8', '7'), ('4', '28'), ('8', '28'), ('4', '27'), ('4', '11'), ('8', '49'), ('4', '7'), ('4', '40'), ('4', '29'), ('8', '22'), ('4', '29'), ('8', '11'), ('8', '28'), ('4', '7'), ('4', '31'), ('8', '42'), ('8', '25'), ('4', '25'), ('4', '17'), ('4', '32'), ('4', '46'), ('4', '19'), ('8', '34'), ('3', '32'), ('4', '21')
    
    +---------+---------+---------------+
    | id_user | id_user | total_matches |
    +---------+---------+---------------+
    | 8       | 4       |             7 |
    +---------+---------+---------------+
    


    1. AWSAuroraインスタンスの書き込みパフォーマンスを最適化する

    2. 日時今すぐPHPmysql(+ PDOバリアント)

    3. データベースから接続文字列を取得する方法

    4. パフォーマンスが低下し始める前に、MySQLデータベースはどのくらい大きくなることができますか