2014-11-08 143 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;