从子查询中获取2个结果

时间:2014-07-03 22:05:18

标签: mysql sql database performance database-design

我想跟踪我的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将是设备的 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获取喜欢,我会执行以下操作:

{{1}}

但这似乎并不高效。

这是一个合理的数据库设计还是你能想到更高效的东西?通过android_id检索喜欢的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

我猜测丢失的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来保证行的排序。