我有下面的表:如何获得表格中的交叉点?
User_id, Key, Value
在本表中的记录,如:
1, "first name", "Bob"
2, "first name", "Mike"
1, "last name", "Jones"
2, "last name", "Carter"
我想要得到一个特定的姓氏和名字对user_ID的。我怎样才能得到一个查询来做到这一点?例如,我想1,如果我查询鲍勃·琼斯
我有下面的表:如何获得表格中的交叉点?
User_id, Key, Value
在本表中的记录,如:
1, "first name", "Bob"
2, "first name", "Mike"
1, "last name", "Jones"
2, "last name", "Carter"
我想要得到一个特定的姓氏和名字对user_ID的。我怎样才能得到一个查询来做到这一点?例如,我想1,如果我查询鲍勃·琼斯
将表与自身:
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"
您的查询都不是最优的。但第二个是非常糟糕的。它将需要o(n2)的复杂性(将简单检查全连接) – arheops 2013-04-22 04:54:29
有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)
您是否总是有两个输入键:一个名字和一个姓氏? – 2013-04-22 04:42:22
是的,如果这个行有一个名字键,那么会出现一个带有姓氏键的行 – MEURSAULT 2013-04-22 04:42:50
我不明白你为什么要用这种方式构造你的数据。你为什么不能把所有的名字都放在一行。 – wayne 2013-04-22 04:44:40