MySQL:使用union检查两列是否包含其他值?

时间:2011-06-28 14:31:43

标签: php mysql sql

我有一个有两个主要列(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事件)

3 个答案:

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