2013-04-22 87 views
0

我有下面的表:如何获得表格中的交叉点?

User_id, Key, Value 

在本表中的记录,如:

1, "first name", "Bob" 
2, "first name", "Mike" 
1, "last name", "Jones" 
2, "last name", "Carter" 

我想要得到一个特定的姓氏和名字对user_ID的。我怎样才能得到一个查询来做到这一点?例如,我想1,如果我查询鲍勃·琼斯

+0

您是否总是有两个输入键:一个名字和一个姓氏? – 2013-04-22 04:42:22

+0

是的,如果这个行有一个名字键,那么会出现一个带有姓氏键的行 – MEURSAULT 2013-04-22 04:42:50

+1

我不明白你为什么要用这种方式构造你的数据。你为什么不能把所有的名字都放在一行。 – wayne 2013-04-22 04:44:40

回答

0

将表与自身:

SELECT t1.User_id 
FROM myTable t1 
JOIN myTable t2 ON t1.User_Id = t2.UserId 
WHERE t1.Key = 'first name' AND t2.Key = 'last name' 
AND t1.Value = "Bob" AND t2.Value = "Jones" 

,或遵循级联条件:

SELECT t1.User_id 
FROM myTable t1 
JOIN myTable t2 ON t1.User_Id = t2.UserId 
WHERE t1.Key = 'first name' AND t2.Key = 'last name' 
AND (t1.Value + ' ' + t2.Value) = "Bob Jones" 
+0

您的查询都不是最优的。但第二个是非常糟糕的。它将需要o(n2)的复杂性(将简单检查全连接) – arheops 2013-04-22 04:54:29

0

有2个任务这里 1)得到不同值的姓氏和名字

2)得到的行有相同的id和第一个= your_first +最后= your_last

简单的查询将是:

select user_id from tab1 
where 
    key="first name" and value=your_first 
    and 
    user_id in (select user_id from tab1 where key="last name" and value=your_last) 

但恐怕这将是坏由MySQL

优化考虑您的user_id有指标,最好的查询将被

select a.user_id from (
select user_id from tab1 where key="first name" and value=your_first) 
)a left join 
(select user_id from tab1 where key="last name" and value=your_last) as b 
on a.user_id=b.user_id where b.user_id is not null; 

如果在上层(php?)脚本中无法获取your_first/your_last名称,则可以用

SUBSTRING_INDEX(name,' ',1) 

    SUBSTRING_INDEX(name,' ',2)