2010-11-10 6 views
1
user_id | user_destination | user_date_out | user_date_in | user_purpose | uid 
0095 | NYC    | 2010-11-25 | 2010-11-26 | Work   | 1 
0105 | Seattle   | 2010-11-15 | 2010-11-20 | Work   | 2 
0095 | Home    | 2010-11-10 | 2010-11-11 | Personal  | 3 
| Nashville  | 2010-11-10 | 2010-11-12 | Doctober  | 4 

У меня есть данные выше в таблице MySQL. Мне нужен запрос, который выведет строку, если это самый последний user_date_out для этого user_id. Трудно объяснить, но строки, которые должны отображаться по запросу, - это uid 2,3 и 4 (UID 1 отпадет, потому что user_date_out «старше», чем UID 3 для одного и того же пользователя). Кто-нибудь может мне с этим помочь? Заранее спасибо!Справка по запросу MySQL (полу-уникальные результаты)

EDIT: Я решил его с помощью следующего запроса:

SELECT * 
FROM `table` 
WHERE `uid` = (
    SELECT `uid` 
    FROM `table` as `alt` 
    WHERE `alt`.`user_id` = `table`.`user_id` 
    ORDER BY `user_date_out` 
    LIMIT 1 
) 
ORDER BY `user_date_out` 
+1

Найдено: http://stackoverflow.com/questions/924494/mysql-group-by-ordering – krx

+0

@krio, что помогло! Я удалил последний «предел 3» и удалил DESC из заказа, и я получил нужные результаты! Спасибо за вашу помощь! – Trevor

+0

@krio - можете ли вы вставить этот ответ в ответ здесь? – warren

ответ

3

По желанию

SELECT * 
FROM `table` 
WHERE `uid` = (
    SELECT `uid` 
    FROM `table` as `alt` 
    WHERE `alt`.`user_id` = `table`.`user_id` 
    ORDER BY `user_date_out` 
    LIMIT 1 
) 
ORDER BY `user_date_out` 
+0

Это вернет uid 3. Мне нужно вернуть 2, 3 и 4. Это, очевидно, только пример данных, поэтому я не могу просто «выбрать wehre user_id = '0105» и « 0123' ». Надеюсь, это имеет мало смысла. Мне сложно объяснить это. Спасибо за ваш ответ. – Trevor

+0

Без того, где вы должны быть хорошими, как есть. Я думаю, вы просмотрели его прямо перед моим редактированием. Это соберет одну запись за user_id с последней датой – krx

+0

Я, должно быть, видел ваш ответ прямо перед редактированием. ;-) Это все еще не работает, к сожалению. Я думаю, это потому, что MySQL группирует поле user_id перед их заказом, поэтому он по-прежнему захватывает UID 1 вместо UID 3 для user_id 0095 – Trevor

1
SELECT t.*, a_subquery.min_user_date_out 
    FROM your_table t 
     JOIN (SELECT user_id, MIN(user_date_out) AS min_user_date_out 
       FROM your_table 
      GROUP BY user_id) a_subquery 
     ON a_subquery.min_user_date_out = t.user_date_out 
     AND a_subquery.user_id = t.user_id 

Поскольку иногда MySQL имеет проблемы ж/подзапросов, здесь тот же самый эквивалентный запрос с самоотключение:

SELECT t.* 
    FROM your_table t 
     LEFT JOIN your_table t2 
     ON t.user_id = t2.user_id 
     AND t.user_date_out > t2.user_date_out 
WHERE t2.user_id IS NULL 

Обратите внимание, что оба этих запроса не будут работать, если у вас есть более одного из user_date_out для данного user_id.

+0

По какой-то причине это возвращает только 1 результат. Хотя я решил, что решил! – Trevor

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