在内连接的结果集上执行mysql左连接

时间:2012-01-01 10:58:14

标签: mysql left-join inner-join

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个元组。这些将在未来大幅增加。

2 个答案:

答案 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。