表
AID PID UID
214 212 1009
213 212 1004
212 212 1002
211 210 1004
210 210 1003
F表
UID FID
1000 1002
1002 1000
1000 1003
1003 1000
1000 1009
1009 1000
1009 1003
1003 1009
1004 1002
1002 1004
我可以像这样在这些表上执行内连接,从A表中获取每个用户的FID的AID和PID,可以从F表中获取。假设我的ID为1000,那么对我来说,我的朋友所执行的操作将是
SELECT AID,PID from A inner join F on A.UID = F.FID where F.UID = '1000';
,结果将是
AID PID
214 212
212 212
210 210
我需要PID只出现一次,无论它与哪个UID相关。此外,我需要具有与之关联的最大AID的PID。
如果尝试使用group by
进行SELECT AID,PID from A inner join F on A.UID = F.FID where F.UID = '1000'
GROUP BY PID;
我会得到
AID PID
212 212
210 210
我希望结果是
AID PID
214 212
210 210
此外,我想使用左连接,即左连接在前一个内部连接结果的结果集上执行它。我读到的原因是左连接比group by执行得更快。 请尝试提高查询效率,因为一个表有超过150万元组,而F表已经有超过5,000个元组。这些将在未来大幅增加。
答案 0 :(得分:1)
试试这个:
SELECT *
FROM (
SELECT AID, PID
FROM A
INNER JOIN F ON A.UID = F.FID
WHERE F.UID = '1000'
ORDER BY AID DESC
) AS t
GROUP BY PID
// 修改强>
简化版:)
SELECT MAX( AID ) AS AID , PID
FROM A
INNER JOIN F ON A.UID = F.FID
WHERE F.UID = '1000'
GROUP BY PID
答案 1 :(得分:0)
试试这个:
select MAX(A.AID),PID
from A left join F on (A.UID=F.FID)
where F.UID=1000
group by PID;
..哦,我看到@piotrekkr已经想到了它就在我前面:)唯一不同的是LEFT JOIN
。
如果您还想要与MAX对应的其他列,则必须使用表A
与其自身的连接:
SELECT A.AID, A.PID, F.FID -- etc.
FROM A
LEFT JOIN A A2
ON A.PID=A2.PID AND A.AID<A2.AID
LEFT JOIN F -- may want to inner join here, up to you
ON A.UID=F.FID
WHERE F.UID=1000
AND A2.AID IS NULL;
A LEFT JOIN A A2 ON A.PID=A2.PID AND A.AID<A2.AID WHERE A2.AID IS NULL
是关键部分 - 它会在每个A
(即原始查询中的PID
)内将表GROUP BY PID
加入其自身,并且还需要A的AID小于A2的。
由于它是左连接,如果A中存在A.AID,使得该PID没有更大的AID(在A2中),则A2.AID将为NULL。这正是最大的AID。