内部联接,跟随和跟随

时间:2012-10-16 01:34:30

标签: php mysql

我在another thread中有一些关于从MySQL中的2个表中提取数据的问题的帮助,看来我需要内连接。

我的表格:

USERS 
  --id (int)
  --username (varchar)

USER_FOLLOW
  -- id (int)
  -- follower (int)
  -- user (int)
  -- subscribed (current_timestamp)

查询,$ following =

SELECT ufollower.id AS follower_id,
ufollower.username AS follower_name,
ufollowed.id AS user_id,
ufollowed.username AS user_name
FROM
/* JOIN twice against users, once to get the follower and once to get the followed */
user_follow 
/* users aliased as ufollower to get the follower details */
JOIN users ufollower ON ufollower.id = user_follow.follower
/* users aliased as ufollowed to get the followed details */
JOIN users ufollowed ON ufollowed.id = user_follow.user
WHERE
user_follow.user = $p_id

p_id是我正在查看的人的个人资料ID。

我需要显示我关注的用户名以及我关注的用户名。我出于某种原因目前使用的代码显示 me 3次而不是我正在关注的3个人:

while($apple = mysql_fetch_array($following)){
  echo '<a href="'.$apple['user_name'].'">'.htmlspecialchars($apple['user_name']).'</a> ';
}

很抱歉打开另一个帖子,我已经盯着它好几个小时了,我无法理解它。

3 个答案:

答案 0 :(得分:1)

一眼就会看到您显示错误的用户名,显示后续而不是跟随者。将您的PHP代码更改为以下内容:

while($apple = mysql_fetch_array($following)){
  echo '<a href="'.$apple['follower_name'].'">'.htmlspecialchars($apple['follower_name']).'</a> ';
}

请注意,您的查询实际上只返回关注您的用户,但不包括您关注的用户(具有user_follow.follower = $p_id的用户)。当然,对于这些用户,您确实希望显示user_name列...

答案 1 :(得分:0)

SELECT f.user,u.username,f.subscribed
FROM user_follow f inner join users u on f.user=u.id
WHERE
f.follower=1
union all
SELECT f.follower,u.username,f.subscribed
FROM user_follow f inner join users u on f.follower=u.id
WHERE
f.user=1;

查询将检索人 user = 1 正在关注 user = 1

的人

答案 2 :(得分:-1)

您正在对用户进行两次内部联接,而不是在ufollowed和ufollower上进行内部联接:

SELECT ufollower.id AS follower_id,
ufollower.username AS follower_name,
ufollowed.id AS user_id,
ufollowed.username AS user_name
FROM
/* JOIN twice against users, once to get the follower and once to get the followed */
user_follow 
/* users aliased as ufollower to get the follower details */
JOIN  ufollower ON ufollower.id = user_follow.follower
/* users aliased as ufollowed to get the followed details */
JOIN ufollowed ON ufollowed.id = user_follow.user
WHERE
user_follow.user = $p_id