2014-03-01 4 views
1

У меня есть таблица, в которой subscription_id используется несколько раз, каждый месяц клиент взимает заказ, который будет сгенерирован с одинаковыми данными & уникальный идентификатор заказа, так что есть столбец «updated_at» ', который также обновляется, поэтому я хочу получить только одну (1) последнюю запись из таблицы на основе subscription_id, я использую следующий запрос, но он не работает и не получает старую запись.Как получить уникальные записи на основе одного столбца в mysql

SELECT * 
FROM members_subscriptions 
WHERE status = 'active' 
GROUP BY subscription_id 
ORDER BY updated_at DESC 

Может ли одно сказать мне, что случилось с этим запросом ....

ответ

1

Вам нужно получить MAX() из updated_at, заказа по пробегам после группировки, так что вы должны сравнить с новейшей датой

SELECT DISTINCT * 
FROM members_subscriptions 
WHERE status = 'active' 
AND updated_at IN(
SELECT MAX(updated_at) 
FROM members_subscriptions 
GROUP BY subscription_id 
) 
ORDER BY updated_at DESC 

или

SELECT DISTINCT m.* 
FROM members_subscriptions m 
INNER JOIN (
    SELECT subscription_id, MAX(updated_at) AS updated_at 
    FROM members_subscriptions GROUP BY subscription_id 
) AS maxdatte USING (subscription_id, updated_at); 
+1

Спасибо Халиду, он сработал ... –

+0

На самом деле, мне кажется, нужно также сравнить 'subscription_id' внутри подзапроса. Вышеприведенный запрос будет работать большую часть времени, так как маловероятно, что точно такая же метка времени содержится в двух строках, но если это так, запрос работает не так, как ожидалось. – GhostGambler

+1

@GhostGambler обновил мой ответ с примером соединения –

0

Проблема с запросом является то, что результат первого группируется и только потом заказал. Если вам нужен последний результат, вам нужно сделать что-то вроде этого:

SELECT * 
    FROM members_subscriptions as main 
    WHERE status = `active` AND `updated_at` = (
     SELECT MAX(`updated_at`) FROM members_subscriptions as sub 
     WHERE status='active' and main.`subscription_id` = sub.`subscription_id` 
    ) 
+1

Это будет возвращать только 1 запись, и я хочу, чтобы получить все ... –

+0

Да, я отредактирован для ваших нужд. – Eternal1

0
SELECT distinct (name) 
FROM members_subscriptions 
WHERE status = 'active' 
GROUP BY subscription_id 
ORDER BY updated_at DESC 

использование отчетливого с именем поля вы хотите плавник d

1

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

SELECT * 
FROM members_subscriptions 
WHERE status = 'active' 
AND (subscription_id, updated_at) IN(
    SELECT subscription_id, MAX(updated_at) 
    FROM members_subscriptions 
    GROUP BY subscription_id 
) 
ORDER BY updated_at DESC 

Но если одна подписка может иметь более одного же даты, то запрос должен использовать уникальный id получить только одну запись из двух или более с той же датой:

SELECT * 
FROM members_subscriptions m 
WHERE status = 'active' 
    AND id = (
     SELECT id FROM members_subscriptions m1 
     WHERE m.subscription_id = m1.subscription_id 
     AND status = 'active' 
     ORDER BY updated_at DESC 
     LIMIT 1 
) 
Смежные вопросы