Mysql 从表A中选择所有行,并为每一行连接表B中的匹配行
我有两张桌子。个人的和个人的。一个代表个人,另一个代表个人事件的日志。persoLog有一个指向个人表的个人日志。我使用join来实现这一点,但要么它没有按预期工作,要么我知道如何使用它是错误的。以下是表格: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
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更快地查找记录。。。。