Androidアプリのユーザーがどのような写真を好むかを追跡したいと思います。
アプリを使用しているすべてのデバイスを含む1つのテーブル(データベース内)があります。ユーザーは(オプションで)自分のアカウントにログインできます。もちろん、いいねはデバイスではなくアカウントにリンクする必要があります。ユーザーは複数のデバイスにログインでき、同じいいねが表示されます。
これで、私のdevices
テーブルは次のようになります。
| device_id | associated_user | android_id |
associated_user
ユーザーがログインしている場合のユーザーIDまたは0はどこにありますか。これandroid_id
は、アプリインスタンスを識別するための一意の文字列です。device_id
自動インクリメントされた内部キーです。
そして私のlikes
テーブルはこのように:
| owner_id | is_user_id | picture_id |
owner_id
誰かがログインしている場合はユーザーIDになり、device_id
そうでない場合はデバイスからログインします。
android_idからいいねを取得するには、次のようにします。
SELECT picture_id WHERE owner_id = (SELECT IF(associated_user > 0, associated_user, device_id) as owner_id FROM devices WHERE android_id='abcdefg' LIMIT 1) AND is_user_id=(SELECT IF(associated_user > 0, 1, 0) as is_user_id FROM devices WHERE android_id='abcdefg' LIMIT 1)
しかし、それはあまり効率的ではないようです。
これは合理的なデータベース設計ですか、それとももっと効率的なものを考えられますか?android_idを介していいねを取得するための最良のアプローチは何でしょうか?
欠落しているfrom
句は次のものだと思いlikes
ます:
SELECT picture_id
FROM likes l
WHERE EXISTS (select 1
from devices d
where android_id = 'abcdefg' and
((l.ownerid = d.associated_user and d.associated_user > 0) or
(l.ownerid = d.device_id and d.associated_user <= 0)
) and
l.is_user_id = (d.associated_user > 0)
);
この場合とクエリの両方で、サブクエリのロジックは少し厄介だと思います。これはより単純で、同じことを行う必要があります。
WHERE EXISTS (select 1
from devices d
where android_id = 'abcdefg' and
((l.ownerid = d.associated_user and l.is_user_id > 0) or
(l.ownerid = d.device_id and l.is_user_id = 0)
)
);
の目的が何であるかはわかりませんlimit 1
が、元のバージョンでは、チェックされている2つの行が異なるという大きなリスクがあります。order by
行の順序を保証する必要があります。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加