2015-01-16 3 views
3

У меня есть 2 таблицы:MYSQL: выберите последнюю запись только (на левой присоединиться к таблице)

Table1:

ID | Mobile Number | Name | Ordered Product| Order Date 

TABLE2:

ID(foreign_key can be inserted multipletimes in this table) |Contacted_for | Time(timestamp) 

Мне нужен запрос для отображения всех данных в таблице 1, и если идентификатор присутствует в таблице 2, мне нужно отобразить последнюю вставленную запись в таблице 2 (со временем) этого идентификатора

Мой запрос

select a.* , b.* FROM table1 a LEFT JOIN table2 b ON a.ID=b.ID GROUP BY a.ID ORDER BY b.Time DESC 

Вот в моем запросе, когда я удаляю Group By A.id, он работает, но показывает все результаты. Но я хочу, чтобы показать окончательный отчет table2 только (без дубликатов записей) ID

Заранее спасибо

+0

только вам нужна последняя запись? –

+0

Ваш вопрос настолько популярен на SO, что даже имеет свой собственный тег: ['наибольший-n-per-group'] (http://stackoverflow.com/questions/tagged/greatest-n-per-group). – axiac

ответ

7

Вам нужны некоторые подзапроса для этого:

SELECT 
    a.*, b.* 
FROM 
    table1 a 
LEFT JOIN 
    (SELECT c.id, d.contacted_for, c.time 
    FROM 
     (SELECT 
      id, 
      MAX(time) time 
     FROM 
      table2 
     GROUP BY id 
     ) c 
    JOIN 
     table2 d 
     ON c.id = d.id AND d.time = c.time 
    ) b 
    ON a.id = b.id 
+1

Это путь. К сожалению, в MySQL налево присоединяется «group by», не определено, какая из записей подзаголов вы получаете, а предложение order by не меняет этого. Таким образом, вам нужен суб-запрос. –

+0

Спасибо, Джерв. Раньше я никогда не использовал Subquery. Спасибо, Тунчай. –

-1

Лучший способ сделать это, чтобы иметь CreatedAt и ModifiedAt полей каждой таблицы в базе данных. Затем вы просто добавляете ORDER BY CreatedAd LIMIT 1. Не уверен, что я имею в виду ваш Time.

У вас также есть ID. Теперь, если ID - AutoIncremental, тогда работа должна быть простой. Используйте ORDER BY id DESC LIMIT 1

+0

, если я добавлю лимит 1, он покажет только 1 данные. Я сказал, что мне нужно отобразить все данные в таблице1. Спасибо за ваш ответ .. –

-1

Попробуйте это ... Я надеюсь, что это может работает

select a.* , b1.* 
FROM table1 a 
LEFT JOIN table2 b1 
ON (a.ID=b1.ID) 
LEFT JOIN table2 b2 
ON (a.ID=b1.ID) AND 
(b1.Time < b2.Time OR b1.Time = b2.Time AND b1.ID < b2.ID) 
WHERE b2.ID IS NULL 
GROUP BY a.ID ORDER BY b1.Time DESC 
+0

«Надеюсь» ?? Нет, это не сработает, у вас есть серьезные ошибки в запросе, – Gervs

+0

Теперь его работа. Я проверил его –

+0

Запрос будет работать, но не является ответом на вопрос. Потому что он не отображает все данные таблицы 1. – Gervs

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