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是正确的。这不会显示问题中描述的内容。它将为每个用户标识显示多行。