我想跟踪我的Android应用程序用户喜欢哪些图片。

我有一个表(数据库中),其中包含使用该应用程序的所有设备。用户将能够(可选)登录到他们的帐户,并且类似的东西应该随后链接到该帐户而不是设备。用户可以登录多个设备,并且应该会看到相同的赞。

现在我的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的用途是什么,但是在您的原始版本中,要检查的两行不同会带来很大的风险。您需要一个order by来保证行的顺序。

10-08 12:23