次の列を持つSQLテーブルがあります。これらの4行は1人のユーザー用です。その行85と86からuser_id
とrole_id
の最新明確な組み合わせを選択する速い方法だろう何SQL- 2つの列の最新の異なる組み合わせを選択してください
| id | user_id | role_id | preference_order | updated_at |
|----|---------|---------|------------------|---------------------|
| 83 | 45 | 7 | 1 | 2016-10-24 03:29:18 |
| 84 | 45 | 10 | 2 | 2016-10-24 03:29:18 |
| 85 | 45 | 7 | 1 | 2016-10-25 05:40:18 |
| 86 | 45 | 10 | 2 | 2016-10-25 05:40:18 |
?
私が得ることができる最も近いこのクエリであるが、それは代わりに、行83と84を取得します。
SELECT *
FROM user_role UR
GROUP BY UR.user_id, UR.role_id
私はまた、85と86を取得し、これを試してみましたが、それは大のために遅すぎるように見えました表:
SELECT *
FROM user_role UR
JOIN (SELECT user_id, role_id, max(updated_at) updated_at FROM user_role GROUP BY user_id, role_id) UR2
ON UR.user_id = UR2.user_id AND UR.role_id = UR2.role_id AND UR.updated_at = UR2.updated_at
ORDER BY UR.order ASC;
を、あなたの第二のクエリの 'EXPLAIN'出力を共有していただけますか? – 1000111
"where"条件または "Group by"に含まれる列のインデックスを確認しました – User
遅すぎますか?インデックスを修正してください。 (user_id、role_id、updated_at、 'order')にインデックスを作成し、悪い 'SELECT *'は使わないでください。代わりに、実際に返される列に名前を付けます。最後に、orderは予約語であるため、テーブル/列識別子のために不適切な選択になっています。 – Strawberry