SQL查询:组合来自两个表的数据

时间:2014-11-08 14:48:57

标签: mysql sql

我有两张表:USERSUSER_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";

现在,重点: 如何查询数据库以获取表USERUSER.name = 'bob'所有记录的所有记录,但同时为{1}}中的每个所选用户记录所有记录?

3 个答案:

答案 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.iduser_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'