与mysql的朋友表

时间:2011-10-13 13:36:15

标签: mysql

我正在使用mysql处理好友表。我想得到朋友用户名和用户名形式的当前用户名。

friend
=======
- id
- uid
- fid

Sample Data 
===========
id  uid  fid
1    1    2
2    3    1

user
====    
- id
- username

Sample Data 
===========
id username
1  saturngod
2  snow
3  John

我目前的代码是

SELECT `user`.id,`user`.username FROM friend
INNER JOIN User
ON user.id = friend.uid
WHERE friend.fid = ( SELECT `id` FROM `User` WHERE `username`='saturngod')

UNION

SELECT `user`.id,`user`.username FROM friend
INNER JOIN User
ON user.id = friend.fid
WHERE friend.uid =  ( SELECT `id` FROM `User` WHERE `username`='saturngod')

它正在运作。我得到了朋友名单。不过,我觉得,sql太长了。

我可以减少这个sql吗?我们可以在没有UNION的情况下编写sql吗?

2 个答案:

答案 0 :(得分:0)

您已加入表格,因此不需要进行子选择。

  SELECT u.id,u.username 
  FROM user u
  INNER JOIN friend f ON (u.id = f.uid)
  WHERE u.username='saturngod'
UNION ALL
  SELECT u2.id,u2.username 
  FROM user u
  INNER JOIN friend f ON (u.id = f.uid)
  INNER JOIN user u2 ON (u2.id = f.fid)
  WHERE u.username='saturngod'

或者你可以这样做:

  SELECT 
    u.id as user_id 
    ,u.username
    ,u2.id as friend_id
    ,u2.username as friendname
  FROM user u
  INNER JOIN friend f ON (u.id = f.uid)
  LEFT JOIN user u2 ON (u2.id = f.fid)
  WHERE 'saturngod' = u.username

如果您希望每位用户使用一行:

  SELECT 
    u.id as user_id 
    ,u.username
    ,GROUP_CONCAT(u2.id) AS friend_ids
    ,GROUP_CONCAT(u2.username) as friendnames
  FROM user u
  INNER JOIN friend f ON (u.id = f.uid)
  LEFT JOIN user u2 ON (u2.id = f.fid)
  WHERE 'saturngod' = u.username  <<-- optional
  GROUP BY u.id

答案 1 :(得分:0)

SELECT CASE WHEN user_id="$id" THEN friend_id ELSE user_id END AS friendID 
FROM user_friend WHERE user_id="$id" OR friend_id="$id" order by friendID ASC