2013-03-09 4 views
0

Я присоединился к нескольким таблицам в запросе MySQL, и они связаны идентификационным номером сотрудника.LIMIT одна строка на ID (MySQL)

Идентификационный номер уникален в таблицах A и B, но имеет несколько строк в таблице C с датой (хранящейся в виде строки), которая уникальна для каждой записи.

Мне нужно идентифицировать самую последнюю дату для каждого идентификационного номера сотрудника в таблице C и таблице LIMIT C до одной записи на идентификационный номер (последнее, очевидно, очевидно).

Я не уверен, как установить LIMIT на 1 для каждого индивидуального идентификационного номера сотрудника.

Ваша помощь приветствуется.

+1

[руководство к спасению!] (Http://dev.mysql.com/doc/refman/5./en/example-maximum-column-group-row.html) (да, я признаю, что это сложно найти). – Wrikken

+0

Я проверил руководство и не видел способа объявить одну строку для каждого экземпляра в другом поле. Мне просто интересно, нет ли здесь другой функции. –

+0

Не в MySQL нет (есть, по-моему, в PostreSQL), действительно, ссылка, на которую я указал вам, имеет/есть ответ (отбросьте свой 'limit', который уже гарантирован другими способами). – Wrikken

ответ

2

Запрос ниже использует подзапрос получить каждый позднюю дату для каждого EmployeeID на tableC.

SELECT a.*, b.*, c.* 
FROM tableA a 
     INNER JOIN tableB b 
      ON a.EmployeeID = b.EmployeeID 
     INNER JOIN tableC c 
      ON a.EmployeeID = c.EmployeeID 
     INNER JOIN 
     (
      SELECT EmployeeID, MAX(date) max_date 
      FROM tableC 
      GROUP BY EmployeeID 
     ) d ON c.EmployeeID = d.EmployeeID AND 
       c.Date = d.max_date 
+0

Спасибо за ваш ответ. Прочитав ссылку на статью Wrikkens выше, я смог зацепить подзапрос в моем предложении WHERE. Я использовал LEFT JOIN, в отличие от INNER JOIN. –

0

Из того, что я понял ваш вопрос:

select a.*, b.*, max(c.date) from A 
    inner join B on A.id=B.id 
    inner join C on A.id=C.id 
    group by A.id 

Эта группа записей по идентификатору А. То есть, вы получите строку в ответ на каждую из строк в A (потому что они однозначно идентифицированы этим идентификатором). То же самое происходит с B, поскольку у них одинаковый идентификатор. И затем, в C, у вас есть несколько записей на запись в A, поэтому группировка их и получение максимальной даты вернут только одну дату C на A (максимальная из них в каждом случае).

+0

Я следую вашей логике здесь, но объявив max (c.date), что не вернет только самую большую дату во всем поле? Или это не так, поскольку он сгруппирован по a.id? Я думаю, что это плохо. –

+0

Он вернет самую большую дату, и поскольку вы группируете A.id, вернет самую большую дату для этого конкретного A.id (который, как я понимаю, вы ищете) –

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