2015-08-14 2 views
1

Я добавляю людей, которые живут в доме в базу данных. Кто-то въезжает в дом 1 1 августа, кто-то переезжает в дом 4 5 августа, и кто-то снова отправляется в дом 1 10 августа. То, что я хочу показать на странице, - это люди, которые живут в доме, например, 9 августа и 11 августа.Получить последнюю запись (дату) для каждого ID в базе данных MySQL

Пример базы данных:

employee----house-date 
1-----------2-----01-01-2012 
5-----------7-----01-01-2012 
1-----------1-----01-08-2012 
3-----------4-----01-01-2012 
1-----------8-----01-09-2012 

Сначала я попытался

SELECT employee FROM habitants WHERE house='$house' AND date <= '$today' ORDER BY date DESC, employee ASC 

Но это показывает один человек в нескольких домах (например, когда работник 1 измененные дома иногда)

Затем я попытался

SELECT employee FROM habitants WHERE house='$house' AND date <= '$today' ORDER BY date DESC, employee ASC LIMIT 1 

Но тогда я получаю только один человек на дом

Тогда я нашел что-то на MAX, поэтому я попытался

SELECT employee, MAX(date), house FROM habitants WHERE house='$house' AND date <= '$today' ORDER BY date DESC, employee ASC GROUP BY house 

Это привело к следующей ошибке:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY huis' at line 1 

Может кто-то показать мне как это сделать правильно? Благодаря!

ответ

2

Один из способов заключается в использовании подзапросов и join:

SELECT h.* 
FROM habitants h JOIN 
    (SELECT house, MAX(date) as maxd 
     FROM habitants 
     WHERE date <= '$today' 
     GROUP BY house 
    ) hh 
    ON hh.house = h.house and hh.maxd = h.date 
WHERE house = '$house'; 

Вы также можете написать это как коррелированных подзапросов:

SELECT h.* 
FROM habitants h 
WHERE h.house = $house AND 
     h.date = (SELECT MAX(date) 
       FROM habitants h2 
       WHERE h2.house = h.house and h2.date <= CURDATE() 
       ); 

Обратите внимание, что вам не нужно проходить в текущей дате , в большинстве случаев. CURDATE() содержит текущую дату (и NOW() - текущее время).

EDIT:

Если вы смотрите где сотрудники, то вы должны найти максимальную дату для каждого сотрудника, а не дом:

SELECT h.* 
FROM habitants h 
WHERE h.house = $house AND 
     h.date = (SELECT MAX(date) 
       FROM habitants h2 
       WHERE h2.employee = h.employee and h2.date <= CURDATE() 
       ); 

Или, наоборот:

SELECT h.* 
FROM habitants h JOIN 
    (SELECT employee, MAX(date) as maxd 
     FROM habitants 
     WHERE date <= '$today' 
     GROUP BY employee 
    ) hh 
    ON hh.employee = h.employee and hh.maxd = h.date 
WHERE h.house = '$house'; 
+0

Благодарим вас за это, отлично работает. Однако теперь я вижу, что сотрудник 8, который перешел из дома 3 в дом 0 (без дома), все еще появляется сегодня. Выполнить из базы данных для сотрудника 8 'сотрудник ---- дачи на дому 8 ----------- 0 ----- 2015-05-01 8 ------- ---- 3 ----- 2015-08-07 8 ----------- 0 ----- 2015-08-11' – William

+0

Работает как очарование. Спасибо! – William

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