mysql - 从子查询中获取 2 个结果

标签 mysql sql database performance database-design

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

我有一张表(在数据库中),其中包含使用该应用程序的所有设备。用户将能够(可选)登录他们的帐户,当然点赞应该链接到该帐户而不是设备。用户可以在多个设备上登录,并且应该看到相同的点赞。

现在我的 devices 表如下所示:

| device_id | associated_user | android_id |

其中,linked_user 是用户 ID(如果用户已登录)或 0。android_id 是用于标识应用实例的唯一字符串。 device_id 只是一个自动递增的内部 key 。

我的喜欢表如下:

| owner_id | is_user_id | picture_id |

owner_id(如果有人登录)将是用户 ID;如果没有,device_id 将是设备的用户 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 来保证行的排序。

关于mysql - 从子查询中获取 2 个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24563969/

相关文章:

mysql - SQL 语法错误 db_query

mysql - 使用来自另一个表的另一个字段的值更新表中的字段

sql - 在 2 个独立的数据库中查找唯一匹配项

php - 从一个字段具有最多数值的数据库中选择

database - 我如何阅读 blcokfile_xxxx

MySQL 将多个值拆分为多行

mysql - 如何解决 "warning"表示无法使用密码 :YES? 连接到 sql 服务器的问题

php - 比较另一个表中是否存在记录

sql - 根据一列中的 id 从多行中获取单个记录

node.js - Mongoose 批量插入错误