我有两张表: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对。例如,对于id为137的USER,可能有3条记录:
user_id:137; key:"height"; value:"610";
user_id:137; key:"food"; value:"candy";
user_id:137; key:"income"; value:"low";
现在,重点:
如何查询数据库以获取表USER
中USER.name = 'bob'
所有记录的所有记录,但同时为{1}}中的每个所选用户记录所有记录?
答案 0 :(得分:3)
如果你真的需要所有匹配的用户及其各自的令牌作为一个结果集,你可以试试这个:
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来获取它们,这将返回一行。
答案 1 :(得分:1)
SELECT u.*, t.* FROM users AS u, users_tokens AS t
WHERE u.name = 'bob' AND t.user_id = u.id;
答案 2 :(得分:0)
SELECT *
FROM USER
INNER JOIN USER_RECORDS ON USER.id = USER_RECORDS.user_id
WHERE user.name = 'bob'