Mysql 选择具有相应值的不同列名
我有一张桌子Mysql 选择具有相应值的不同列名,mysql,sql,Mysql,Sql,我有一张桌子 P_Id | userid | year | month | day -----+--------+------+-------+------ 3 | 3 | 2011 | 2 | 2 5 | 1 | 2011 | 2 | 3 16 | 8 | 2011 | 3 | 4 5 | 3 | 2011 | 4 | 4 17 | 1 | 2011 |
P_Id | userid | year | month | day
-----+--------+------+-------+------
3 | 3 | 2011 | 2 | 2
5 | 1 | 2011 | 2 | 3
16 | 8 | 2011 | 3 | 4
5 | 3 | 2011 | 4 | 4
17 | 1 | 2011 | 4 | 6
8 | 4 | 2011 | 7 | 7
9 | 3 | 2011 | 8 | 8
10 | 8 | 2011 | 9 | 9
我想选择不同的列,即userid,但也要选择首先遇到的年、月和年的相应值
对于给定的上表,应输出以下内容
P_Id | userid | year | month | day
-----+--------+------+-------+------
3 | 3 | 2011 | 2 | 2
5 | 1 | 2011 | 2 | 3
16 | 8 | 2011 | 3 | 4
8 | 4 | 2011 | 7 | 7
或
如果我按年、按月、按日订购表格
必须只选择首先遇到的用户ID,而不能选择其余的用户ID将年、月和日放入本机日期列,然后执行以下操作:
select p_id, userid, min(the_date) from table group by p_id, userid
它将提供最快的结果
如果您不能修改表,并且应该使用年+月+日,那么您可以将此值转换为日期,并且仍然使用min功能。您的查询如下
SELECT ta.*
FROM
( SELECT DISTINCT userid
FROM tableX
) AS di
JOIN
tableX AS ta
ON ta.P_id =
( SELECT ti.P_id
FROM tableX AS ti
WHERE ti.userid = di.userid
ORDER BY ti.year, ti.month, ti.day
LIMIT 1
)
select * from (select min(p_id)p_id,userid, min(year)year,min(month)month,min(day)day from tsil group by userid) t order by p_id;
这就是测试
create table tsil(p_id int, userid int, year int, month int, day int);
insert into tsil values (3,3,2011,2,2)
,(5,1,2011,2,3)
,(16,8,2011,3,4)
,(5,3,2011,4,4)
,(17,1,2011,4,6)
,(8,4,2011,7,7)
,(9,3,2011,8,8)
,(10,8,2011,9,9);
commit;
select * from (select max(p_id)p_id,userid, min(year)year,min(month)month,min(day)day from tsil group by userid) t order by p_id;
drop table tsil;
这就是结果;你所期望的
+------+--------+------+-------+------+
| p_id | userid | year | month | day |
+------+--------+------+-------+------+
| 3 | 3 | 2011 | 2 | 2 |
| 5 | 1 | 2011 | 2 | 3 |
| 8 | 4 | 2011 | 7 | 7 |
| 16 | 8 | 2011 | 3 | 4 |
+------+--------+------+-------+------+
到目前为止,您尝试了什么查询?我正在尝试,但无法获得的相应值userid@Sunny:如果你认为下面的答案之一是正确的,那么请接受它。。。这就是它的工作原理……我没有得到想要的结果,因为你不想要一行写着
5 | 1 | 2011 | 4 | 3
或17 | 1 | 2011 | 2 | 3
,这可以通过为不同的列取不同行的值来实现。通过使用min函数,我得到了错误的列,我希望这个查询不会起作用。主要问题是相同用户id的日期(2011,2,10)和(2010,4,10)。您的查询将返回不存在的日期(2010,2,10)。我不清楚这是否会给他一个像17 | 1 | 2011 | 2 | 3
这样的行@Ken是正确的。这不会显示问题中描述的内容。它将为每个用户标识显示多行。