我有一个有两个主要列(uid和fid)的朋友表,我基本上试图看看例如朋友是否也是用户的朋友,所以
uid 5 -> fid 6
uid 6 -> fid 5
我曾尝试混合并混合SELECT查询以某种方式返回决定结果,但似乎无法找到任何东西。 count()将返回一列或两列(两个是正确的),但PHP的PDO没有很好的方法来查找没有hackish循环的所选(未受影响)行数。
(SELECT count(uid) FROM friends WHERE uid = 1 AND fid = 2)
UNION ALL -- Or plain union
(SELECT count(uid) FROM friends WHERE uid = 2 AND fid = 1)
当然,这仍然会返回一行或两行0/1或0或1
您能想到在第一列中返回MySQL中的1或0的方法吗?或者将这个功能写入我的程序的更好方法? (我尽量避免使用hackish事件)
答案 0 :(得分:4)
你需要一个自动联接来返回所有正在进行双射友谊的情侣用户/朋友:
SELECT f.uid, f.fid
FROM Friend f
INNER JOIN Friend ff
ON f.uid = ff.fid
AND f.fid = ff.uid
请注意,它将返回'重复',在您的情况下:
uid | fid
5 6
6 5
答案 1 :(得分:2)
为什么不进行单一查询?
select count(*)
from friends
where ((uid = 1) and (fid = 2)) or ((uid = 2) and (fid = 1))
请注意,您必须进行计数(*),因为如果有相互的友谊,UID会有所不同。你得到两行,计数为1,单行记录,计数为2。
答案 2 :(得分:2)
SELECT a.uid, a.fid
FROM friends a
JOIN friends b
ON a.fid = b.uid
AND a.uid = b.fid
WHERE a.uid = 1
AND a.fid = 2
避免“重复”行...例如每两个朋友2行,添加条件a.uid < b.uid
:
SELECT a.uid, a.fid
FROM friends a
JOIN friends b
ON a.fid = b.uid
AND a.uid = b.fid
AND a.uid < b.uid
WHERE a.uid = 1
AND a.fid = 2
所以,要计算所有友谊,请使用:
SELECT COUNT(*) AS countAllFrienships
FROM friends a
JOIN friends b
ON a.fid = b.uid
AND a.uid = b.fid
AND a.uid < b.uid
因此,要计算用户X的朋友,请使用:
SELECT a.uid
, COUNT(*) AS numberOfFriends
FROM friends a
JOIN friends b
ON a.fid = b.uid
AND a.uid = b.fid
WHERE a.uid = X
GROUP BY a.uid