2012-03-11 4 views
2

У меня есть таблица, каквыбор отчетливого имени столбца с respectives значения

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 

Я хочу, чтобы выбрать отчетливый столбец т.е. идентификатор пользователя, но и соответствующее значение года месяца и год, которые были обнаружены первым.

Для приведенной выше таблицы следующие должны быть выведены

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 

или Если я заказываю таблицу по годам, месяцам и дням идента встречающееся первым должен быть выбран и не должны быть выбраны остальные только

+0

Какой запрос вы пытались до сих пор? –

+0

Я пытаюсь, но не могу получить соответствующие значения userid –

+1

@Sunny: Если вы считаете, что один из ответов ниже, то ПОЖАЛУЙСТА, принимайте его ... Вот как работает SO ... –

ответ

1

Помещенный год, месяц и день родного даты колонки и сделать это:

select p_id, userid, min(the_date) from table group by p_id, userid 

Это обеспечит самый быстрый результат.

Если вы не можете изменить свой стол и использовать год + месяц + день, то вы можете преобразовать эти значения на сегодняшний день и использовать мин..

+0

спасибо asktomsk –

+1

Мне непонятно, что это не даст ему строки вроде '17 | 1 | 2011 | 2 | 3'. –

+0

спасибо работа –

1
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 
     ) 
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 | 
+------+--------+------+-------+------+ 
+0

с помощью функции min Я получаю неправильные столбцы, которые мне нужны –

+0

Я поднял свой ответ. – dursun

+0

этот запрос не будет работать. Основная проблема заключается в таких датах, как (2011, 2, 10) и (2010, 4, 10) для одного и того же идентификатора пользователя. Ваш запрос вернет несуществующую дату (2010, 2, 10) – asktomsk

Смежные вопросы