2013-04-19 2 views
0

мои данные в БД MySQL выглядит следующим образом (но не только это 4, я уже много людей, которые затем, как только появляются все более, но с разной квалификацией и различными измененными датамиСлияние при использовании SQL GROUP BY

the data i have in my database

выбор будет что-то вроде:

SELECT * FROM table where person_id=1 GROUP BY person_id 

так, если я сделать этот выбор, и я группа по person_id я получить что-то вроде этого:

my result after selection an group by

есть ли возможность сгруппировать по личности id, но сказать: хорошо, дайте мне последнюю измененную квалификацию? обычно у меня нет person_id в инструкции SQL.
поэтому я хочу, чтобы все лицо из моего выбора, но только результат с последним изменением квалификацией
(я надеюсь, что я объяснил, что это хорошо eonough так что вы понимаете, в чем проблема)

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

ответ

3

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

select t1.id, 
    t1.person_id, 
    t1.name, 
    t1.qualification, 
    t1.created, 
    t1.modified, 
    t1.version 
from yourtable t1 
inner join 
(
    select person_id, max(modified) MaxMod 
    from yourtable 
    group by person_id 
) t2 
    on t1.person_id = t2.person_d 
    and t1.modified = t2.maxmod 
+0

это звучит больше как я хочу, я дам ему попробовать, спасибо! – Joerg

+0

+1 думаю, что так :) – Stephan

+0

выглядит так, как будто работает, но производительность настолько неприемлема, я сделаю более простой вызов SQL, а затем сделаю оптимизацию в java. но спасибо в любом случае @bluefeet – Joerg

0

Если вы хотите последнюю измененную запись конкретного человека, то просто сделать

select * from table 
where person_id = 1 
order by modified desc 
limit 1 
0

EDIT

я неправильно понял вопрос, и я буду обновлять ответ

Попробуйте (если вы хотите последнее изменение квалификации для каждого человека):

SELECT 
    person_id, 
    qualification 
FROM 
    table as a 
INNER JOIN (
    SELECT 
    person_id, 
    MAX(modified) as za_date 
    FROM 
    table 
    GROUP BY 
    person_id 
) as tmp 
    ON a.person_id = tmp.person_id 
    AND a.modified = tmp.za_date 

Если вы хотите последнее изменение квалификации для все человек:

SELECT 
    qualification 
FROM 
    table 
WHERE modified = (
     SELECT 
      MAX(modified) 
     FROM 
      table 
    ) 
+0

да, его, как 'WHERE 1 = 1' попробовать его, чтобы увидеть что он работает – Stephan

+0

его просто стандарт для форматирования запросов иметь WHERE 1 и cOND1 и cond2 его более readeable этот путь – Stephan

+0

[Основная цель «WHERE 1» (или «WHERE 1 = 1»), кажется, динамическая фильтрация] (http://stackoverflow.com/a/242831/17117960). Я бы не советовал использовать это для всех запросов везде. Это не более читаемо, если не по какой-либо другой причине, кроме как лишний бит кода для чтения, который ничего не делает (и некоторые люди могут подумать, что вы пытаетесь сделать что-то еще, но ошибочно или не можете его понять). – Dukeling

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