2016-07-14 5 views
2

Мне нужно отобразить последние 2 результата из таблицы (результатов), результаты состоят из нескольких строк с соответствием submitId, количество строк для представления неизвестно, и, конечно же, я предпочитают один запрос.Группа MySQL несколько строк на основе значения DISTINCT

Вот структура таблицы БД

submissionId  input  value 

    1   name   jay 
    1   phone  123-4567 
    1   email  [email protected] 
    2   name   mo 
    2   age   32 
    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

Результаты Desierd:

submissionId  input  value 

    3   name   abe 
    3   email  [email protected] 
    4   name   jack 
    4   phone  123-4567 
    4   email  [email protected] 

Или еще лучше, если я могу объединить строки, как это:

3   name   abe 3  email  [email protected] 
4   name   jack 4  phone  123-4567   4   email  [email protected] 
+0

И по «последним двум результатам» вы имеете в виду те, у которых наибольшие и второй величайшие значения 'submissionId'? –

+0

@vkp я попытался это: SELECT DISTINCT t1.submissionId из результатов t1 LEFT JOIN результаты t2 ON t1.submissionId = t2.submissionId GROUP BY t1.submissionId –

+0

@JohnBollinger Да (на данный момент) Позже я планирую добавить столбец даты и получить 2 последних результата –

ответ

2

Вы можете использовать limit в подзапросы в предложении from, поэтому типичный способ написать это:

SELECT submissionDate, input, value 
FROM t join 
    (select distinct submissionDate 
     from t 
     order by submissionDate desc 
     limit 2 
    ) sd 
    on t.submissionDate = sd.submissionDate; 
+0

Спасибо, с небольшой модификацией это работало по желанию. –

+0

Я постараюсь запомнить это в следующий раз, когда увижу аналогичный вопрос. –

2

Один вариант здесь заключается в использовании подзапроса для определения последних и ближайших последних submissionId:

SELECT submissionId, input, value 
FROM yourTable 
WHERE submissionId >= (SELECT MAX(submissionId) FROM yourTable) - 1 
ORDER BY submissionId 

Демо здесь:

SQLFiddle

Update:

Если submissionId столбец действительно тип даты, и вы хотите самые последние две даты в ваш результат set, то следующий запрос достигнет этого. Обратите внимание, что подзапрос в предложении WHERE, в то время как уродливый, не коррелирует с внешним запросом. Это означает, что оптимизатор MySQL должен иметь возможность выяснить, что ему нужно только запустить его один раз.

SELECT submissionDate, input, value 
FROM yourTable 
WHERE submissionDate >= 
    (SELECT MAX(CASE WHEN submissionDate = (SELECT MAX(submissionDate) FROM yourTable) 
        THEN '1000-01-01' 
        ELSE submissionDate 
       END) FROM yourTable) 
ORDER BY submissionDate 

SQLFiddle

+0

Возврат этой ошибки: эта версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery» –

+0

@MoisheySchwartz Я обновил свой ответ. –

+0

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

0

Это как запрос выглядит сейчас, поэтому я могут получить результаты с помощью LIMIT, RANGE и id/timestamp (с помощью Tim и Gordon):

SELECT * 
FROM rmyTable t 
JOIN 
(SELECT DISTINCT sd.submissionId 
FROM myTable sd 
WHERE sd.questionId = yourId 
ORDER BY sd.submissionId 
LIMIT 2 
) t2 
ON t.submissionId = t2.submissionId 
WHERE t.formId = yourId 
AND dateTime BETWEEN 0000 AND 1111 
Смежные вопросы