我有两个表:USERS
和USER_TOKENS
USERS
的结构如下:
id (INT)
name (VARCHAR)
pass (VARCHAR)
birthdate (DATETIME)
...
etc
USER_TOKENS
的结构如下:
user_id (INT)
key (VARCHAR)
value (VARCHAR)
本质上USERS
包含基本数据,而USER_TOKENS
用于存储给定用户的完全任意的KEY / VALUE对。因此,例如对于USER,可能有3条记录,其ID为137:
user_id:137; key:"height"; value:"610";
user_id:137; key:"food"; value:"candy";
user_id:137; key:"income"; value:"low";
现在,要点:如何查询数据库以从USER
where的表中获取所有记录USER.name = 'bob'
,但同时USER_TOKENS
为每个选定用户中的所有记录呢?
如果您确实需要所有匹配的用户及其各自的令牌作为一个结果集,则可以尝试以下操作:
SELECT u.id, ut.key, ut.value -- and list also other required fields
FROM Users u
LEFT JOIN User_tokens ut ON u.id = ut.user_id
WHERE u.name = 'bob'
尽量不要使用SELECT *
,因为你得到的方式(你会看到两个重复的字段users.id
和user_tokens.user_id
它们是百达相等)。使用LEFT JOIN,您还将获得没有令牌的用户。
但是此查询对我而言意义不大,因为您已经知道用户,所以为什么要在每一行中重复用户的数据。(只有在有更多名为“ bob”的用户时才有意义)。
您可能需要这样的东西:
SELECT ut.key, ut.value
FROM Users u
INNER JOIN User_tokens ut ON u.id = ut.user_id
WHERE u.name = 'bob'
也许更好:
SELECT ut.key, ut.value
FROM User_tokens ut
WHERE EXISTS (SELECT * FROM Users u WHERE u.name = 'bob' AND u.id = ut.user_id)
这将列出名称为“ bob”的所有用户的所有令牌。
如果只有一个,bob
则无需包含users
表中的所有重复数据-您最终可以使用单独的SELECT最终将其返回一行。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句