2016-11-22 76 views
0

我是MySQL newby,由于某种原因,此解决方案正在逃避我。我有两个表:MySQL查询在第二个表中查找值

users 
|--------------------------------------------------| 
| user_id | user_name | email      | 
|--------------------------------------------------| 
| 1  | user1  | [email protected]  | 
| 2  | user2  | [email protected] | 
| 3  | user3  | [email protected] | 
|--------------------------------------------------| 

user_meta 
|---------------------------------| 
| user_id | meta_key | meta_value | 
|---------------------------------| 
| 1  | first_name | john  | 
| 1  | last_name | doe  | 
| 2  | first_name | joe  | 
| 2  | last_name | schmoe | 
| 3  | first_name | harry | 
| 3  | last_name | pickle | 
|---------------------------------| 

我想产生这个输出的单查询:

|---------------------------------------------------------------| 
| user_id | first_name | last_name | email      | 
|----------------------------------|----------------------------| 
| 1  | john  | doe  | [email protected]  | 
| 2  | joe  | schmoe | [email protected] | 
| 3  | harry  | pickle | [email protected] | 
|----------------------------------|----------------------------| 

我试图加入的几个口味,并试图子查询,但必须有一些简单的方法,我”失踪。我可以得到名字或姓氏,但不能同时输出。任何帮助,将不胜感激。

感谢

+1

你能告诉我们你已经尝试了什么? – driconmax

+0

了解连接如何在数据集方面工作会对您有所帮助。这里有一篇[很好的文章](https://blog.codinghorror.com/a-visual-explanation-of-sql-joins/),它会告诉你如何连接这些表格并达到预期的效果。注意:这里的关键是你必须加入user_meta两次来自用户(别名都加入)!一次用于'first_name',再用于'last_name'认为你有3组数据。带有user_ID的电子邮件地址,带有user_ID的first_name数据集和带有user_ID的Last_name数据集。显示你的尝试,我们可以帮助! – xQbert

回答

0

我这里使用的左外连接,因为没有保证一个FIRST_NAME或姓氏键将针对给定的USER_ID存在。在这些情况下,我们仍然会显示user_id和电子邮件,但名称上会有NULL。

SELECT U1.user_id, M1.first_name, M2.last_name, U1.email 
FROM users U1 
LEFT OUTER JOIN user_meta M1 ON M1.user_id = U1.user_id AND M1.meta_key = 'first_name' 
LEFT OUTER JOIN user_meta M2 ON M2.user_id = U1.user_id AND M2.meta_key = 'last_name' 
+0

这是双连接,扔我。我没有得到,你必须把元表作为两个单独的表。谢谢! – user7195201

0

尝试这将是有益的

select 
    u.user_id, 
    meta_value as first_name, 
    meta_value as last_name, 
    email 
from users u left outer join user_meta um on u.user_id = um.user_id 
group by u.user_id