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

複雑なフィルタリングを使用してランダムな行を1つ選択します

    2つの問題解決策があります。

    1)ランダムIDを使用して、https://stackoverflow.com/a/4329447/2051938>

    SELECT *
    FROM profiles AS r1
    JOIN
        (SELECT CEIL(RAND() *
                         (SELECT MAX(id)
                            FROM profiles)) AS id)
            AS r2
    WHERE
        r1.id >= r2.id
        AND
        r1.first_name IS NOT NULL
    AND
    NOT EXISTS (
        SELECT *
        FROM proposal
        WHERE
            proposal.to_id = r1.id
    )
    LIMIT 0 , 1
    

    2)ORDER BY RAND()を使用

    SELECT *
    FROM
        (
            SELECT *
            FROM profiles
            WHERE
                profiles.first_name IS NOT NULL
            ORDER BY RAND()
        ) AS users
    WHERE
        NOT EXISTS (
            SELECT *
            FROM proposal
            WHERE
                proposal.to_id = users.id
        )
    LIMIT 0 , 1
    

    最初の解決策は高速ですが、「idの穴」に問題があります "そしてidを取得したとき 最後から(ユーザーは一致するよりも早く終了する場合があります)

    2番目の解決策は遅くなりますが、欠陥はありません!



    1. Oracleの同時実行性はSQLServerよりも優れていますか?

    2. SQL:文字列の実行方法が等しくない

    3. SQLite ALTER TABLE

    4. Oracleはエラー時にトランザクションをロールバックしますか?