Mysql 从表A中选择所有行,并为每一行连接表B中的匹配行

Mysql 从表A中选择所有行,并为每一行连接表B中的匹配行,mysql,mysqli,Mysql,Mysqli,我有两张桌子。个人的和个人的。一个代表个人,另一个代表个人事件的日志。persoLog有一个指向个人表的个人日志。我使用join来实现这一点,但要么它没有按预期工作,要么我知道如何使用它是错误的。以下是表格: ID NAME SECTION 1 joe driver 2 george technic ID PERSONAL_ID EVENT DATE 1 1 idle November, 26 2014 12:28:52+0000

我有两张桌子。个人的和个人的。一个代表个人,另一个代表个人事件的日志。persoLog有一个指向个人表的个人日志。我使用join来实现这一点,但要么它没有按预期工作,要么我知道如何使用它是错误的。以下是表格:

ID  NAME    SECTION
1   joe     driver
2   george  technic

ID  PERSONAL_ID EVENT   DATE
1   1           idle    November, 26 2014 12:28:52+0000
2   1           drive   November, 26 2014 12:28:52+0000
3   1           idle    November, 26 2014 12:28:52+0000
4   2           idle    November, 26 2014 12:28:52+0000
5   2           idle    November, 26 2014 12:28:52+0000
因此,我想在这里列出个人及其最新日志:

ID  NAME    SECTION EVENT   DATE
1   joe     driver  idle    November, 26 2014 12:28:52+0000
2   george  technic idle    November, 26 2014 12:28:52+0000
我使用这个查询

SELECT p.*, pl.event, pl.date 
  FROM personal p
RIGHT JOIN persoLog pl 
  ON p.id = pl.personal_id
我希望返回所有个人信息,只包含匹配的日志,但我得到了以下结果:

ID  NAME  SECTION  EVENT  DATE
1   joe    driver  idle   November, 26 2014 12:40:24+0000
1   joe    driver  drive  November, 26 2014 12:40:24+0000
1   joe    driver  idle   November, 26 2014 12:40:24+0000
2   george technic idle   November, 26 2014 12:40:24+0000
2   george technic idle   November, 26 2014 12:40:24+0000 
我做错了什么

这是我问题的SQLFIDLE链接: 试试这个:

SELECT p.*,
pl.event, pl.date 
FROM personal p
JOIN (
     SELECT personal_id,max(date) as LastDate from persoLog
     GROUP BY personal_id) x on p.id=x.personal_id
JOIN persoLog pl ON p.id = pl.personal_id 
AND pl.date=x.lastDate

但是,在示例数据中,日志表中的所有日期都是相同的。解决这个问题,上面的方法应该会起作用

我相信这应该会起作用:

SELECT p.*, pl.event, pl.date
FROM personal p
LEFT JOIN persoLog pl ON p.id = pl.personal_id
GROUP BY p.id
ORDER BY date DESC

这不会将最新的persoLog连接到主行。相反,它加入了第一个persoLog,这不是我想要的。thx@Sparky这确实有效,但在一个大的db上似乎工作得太慢了。我会四处看看,如果找不到更快的方法,我会继续这样做。首先看看表上的索引。这是一个非常简单的查询,所以没有太多的优化查询…你说的索引是什么意思?索引是一个数据库元素,可以加速搜索。它的作用就像一本书的索引,它包含键(可能最好是个人id)和表中的位置。它允许SQL更快地查找记录。。。。