2014-11-08 144 views
2

合并数据我有两个表:USERSUSER_TOKENSSQL查询:从两个表

USERS结构如下:

user_id (INT) 
key  (VARCHAR) 
value (VARCHAR) 

本质:

id (INT) 
name (VARCHAR) 
pass (VARCHAR) 
birthdate (DATETIME) 
... 
etc 

USER_TOKENS结构如下USERS包含基本数据,而USER_TOKENS用于完全存储给定用户的任意KEY/VALUE对。因此,例如,可能有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其中USER.name = 'bob'得到所有的记录,但在同时为每个选定用户的所有记录从USER_TOKENS

回答

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那么不需要包含来自users表的所有重复数据 - 您可以最终使用单独的SELECT获取它们,该SELECT将返回单行。

+0

+1成为第一个走过并解释它的人,而不仅仅是复制和粘贴代码。 – AdamMc331 2014-11-08 22:38:37

+0

谢谢,彻底解释,当然还有工作。然而,关于最后一个代码片段,我永远不会处于某个特定用户的场景中,否则就像您说我可以用两个单独的查询完成它一样。它更像是可能有100个“bob”用户,或者我应该收集所有名称与“b%”类似的用户。 – resle 2014-11-08 23:01:21

+0

上述问题。鉴于“NAME”用作表中的字段名称,最终结果在使用FETCH_ASSOC通过php PDO读取时会产生歧义。任何方式来获得以完整TABLE.COLUMN格式输出的列? – resle 2014-11-09 01:30:32

0
SELECT * 
FROM USER 
INNER JOIN USER_RECORDS ON USER.id = USER_RECORDS.user_id 
WHERE user.name = 'bob' 
1
SELECT u.*, t.* FROM users AS u, users_tokens AS t 
WHERE u.name = 'bob' AND t.user_id = u.id;