Добавление (ВЫБОР) еще двух других столбцов к этому набору результатов - PullRequest
4 голосов
/ 22 октября 2011

Предположим, у меня есть следующая таблица MySQL:

user_id    date_of_application   date_ended    grade    status    
---------------------------------------------------------------

 1            2011-01-01         2011-02-28     1.0     Ended
 1            2011-02-02         2011-03-28     1.0     Ended
 1            2011-03-03         2011-04-28     (1.5)   Ended

 2            2011-01-01         2011-02-20     2.0     Ended
 2            2011-02-02         2011-03-11     2.5     Ended
 2            2011-03-03         2011-04-28     (1.0)   Ended

 1            2011-05-10              -          -      Pending
 2            2011-05-15              -          -      Pending

  • обратите внимание, что таблица может содержать несколько записей одного и того же пользователя, если все ее предыдущие приложения закончились (статус = закончен)
  • user_id не является уникальным
  • дата в гг-мм-дд формат
  • дата_не и оценка обновляются тольков момент, когда приложение закончилось

Здесь я хочу получить все строки (вместе будут все столбцы) ГДЕ состояние «Ожидание» и такое, что значение дляСтолбец оценка для каждой из этих извлеченных строк представляет собой значение последней оценка (в скобках выше), где статус «Завершено» для данного конкретного пользователя (или строки).

Результат:

user_id    date_of_application   date_ended    grade    status    
---------------------------------------------------------------

 1            2011-05-10         2011-06-10     1.5      Pending
 2            2011-05-15         2011-06-15     1.0      Pending

---- РЕДАКТИРОВАТЬ -----:

Я не уверен, нужно ли мне создавать еще один поток для этих дополнений ('будет делать, если мне посоветуют сделать это)Во всяком случае - я решил пойти с ответом ypercube (см. ниже) (который работает, за исключением прокомментированной части).Тем не менее, в дополнение к приведенной выше таблице , я также хотел бы выбрать еще два столбца (каждый из другой таблицы):

Рабочий код, который выдает желаемый результат таблицы (см. выше):

SELECT user_id
     , date_of_application
     , date_ended
     , ( SELECT te.grade
         FROM TableX AS te
         WHERE te.status = 'Ended'
           AND te.user_id = t.user_id    

         ORDER BY te.date_ended DESC
         LIMIT 1
       ) AS grade
     , status
FROM TableX AS t
WHERE status = 'Pending'

Теперь мне нужно выбрать эти два других столбца ( is_first_time_user и name ) вместе с ранее упомянутой таблицей результатов.Обратите внимание, что user_id для обеих этих таблиц уникальны:

Table2:

user_id    is_firs_time_user
-----------------------------

 1               no
 2               no

Таблица3:

user_id    name  
----------------------

 1        User A
 2        User B

Ответы [ 3 ]

4 голосов
/ 22 октября 2011
SELECT user_d
     , date_of_application
     , date_ended
     , ( SELECT te.grade
         FROM TableX AS te
         WHERE te.status = 'Ended'
           AND te.user_id = t.user_id
           AND te.date_ended < t.date_of_application      --- not sure if 
                                                          --- this is needed
         ORDER BY te.date_ended DESC
         LIMIT 1
       ) AS grade
     , status
FROM TableX AS t
WHERE status = 'Pending'
4 голосов
/ 22 октября 2011

Вот решение, которое включает производную внутреннюю таблицу (ENDED), которая содержит только самую последнюю запись Ended для user_id. (Для ясности я пропустил столбцы, которые не относятся к вопросу получения оценки).

 SELECT PEND.user_id, ENDED.grade FROM YourTable PEND
    INNER JOIN 
       (
         SELECT user_id, grade FROM YourTable T1
         WHERE status = 'Ended' AND NOT EXISTS 
            (SELECT * FROM YourTable T2 
             WHERE T2.user_id = T1.user_id AND T2.date_ended > T1.date_ended) 
       ) ENDED
       ON PEND.user_id = ENDED.user_id
    WHERE PEND.status = 'Pending'

Если у MySQL есть проблема с вложенным SELECT, или если концепция «самая последняя законченная запись для пользователя» является той, которую вы будете использовать в другом месте в вашем приложении, или если вы просто хотите больше ясности, вы можете сделать это:

 CREATE VIEW MostRecentEndedGrade (user_id, grade) AS
    SELECT user_id, grade FROM YourTable T1
         WHERE status = 'Ended' AND NOT EXISTS 
            (SELECT * FROM YourTable T2 
             WHERE T2.user_id = T1.user_id AND T2.date_ended > T1.date_ended) 

 SELECT PEND.user_id, ENDED.grade 
    FROM YourTable PEND INNER JOIN MostRecentEndedGrade ENDED
    ON PEND.user_id = ENDED.user_id
    WHERE PEND.status = 'Pending'
0 голосов
/ 22 октября 2011

Я считаю, что самый простой способ - создать представление с помощью этого запроса:

SELECT user_id, MAX(date_ended) AS max_date FROM table 
WHERE status='ENDED' 
GROUP BY user_id

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

SELECT t1.user_id, t1.date_of_application,
   (SELECT t.date_ended, t.grade FROM table t, view v 
   WHERE t.user_id=v.user_id 
   AND t.date_ended = v.max_date),
   t1.status FROM table t1
WHERE status='PENDING'
...