MySQL编码问题

时间:2010-10-14 12:59:34

标签: php mysql

users

时如何与users_friends.user_id user_id = '" . $user_id . "'加入users

users_friends.friend_id

时加入friend_id = '" . $user_id . "' user_id = '" . $user_id . "'

如果INNER JOIN users ON users_friends.user_id = users.user_id

friend_id = '" . $user_id . "'

如果INNER JOIN users ON users_friends.friend_id = users.user_id

SELECT COUNT(user_id) as friends
FROM users_friends
WHERE (user_id = '" . $user_id . "' 
OR friend_id = '" . $user_id . "')
AND friendship_status = '1'

当前的MySQL代码。

{{1}}

2 个答案:

答案 0 :(得分:0)

 (SELECT * FROM users_friends JOIN users ON users.user_id = users_friends.friend_id 
    WHERE   users_friends.friend_id = '" . $user_id . "')
 UNION
 (SELECT * FROM users_friends JOIN users ON users.user_id = users_friends.user_id 
    WHERE users_friends.user_id = '" . $user_id . "')

这样的事情可能会起作用。

在查看user_friends表时,您应该使用它来加入users表。

答案 1 :(得分:0)

如果我理解正确,那么尝试这样的事情:

call list_user_friends(1);

call list_all_friends_of_user(1);

完整的脚本:

-- TABLES

drop table if exists users;
create table users
(
user_id int unsigned not null auto_increment primary key,
username varbinary(32) unique not null
)
engine=innodb;

drop table if exists user_friends;
create table user_friends
(
user_id int unsigned not null,
friend_user_id int unsigned not null,
primary key (user_id, friend_user_id) -- note clustered composite PK (innodb only)
)
engine=innodb;

-- STORED PROCEDURES

drop procedure if exists insert_user_friend;

delimiter #
create procedure insert_user_friend
(
in p_user_id int unsigned,
in p_friend_user_id int unsigned
)
proc_main:begin

  if p_user_id = p_friend_user_id then
    leave proc_main;
  end if;

  insert into user_friends (user_id, friend_user_id) values (p_user_id, p_friend_user_id);

end proc_main #

delimiter ;

drop procedure if exists list_user_friends;

delimiter #
create procedure list_user_friends
(
in p_user_id int unsigned
)
proc_main:begin

  select
    u.*
  from
    user_friends uf
  inner join users u on uf.friend_user_id = u.user_id
  where
    uf.user_id = p_user_id
  order by
   u.username;

end proc_main #

delimiter ;

drop procedure if exists list_all_friends_of_user;

delimiter #
create procedure list_all_friends_of_user
(
in p_user_id int unsigned
)
proc_main:begin

  select
  u.*
  from
  users u
  inner join
  (
  select friend_user_id as user_id from user_friends where user_id = p_user_id
  union
  select user_id from user_friends where friend_user_id = p_user_id
  ) all_friends
  on u.user_id = all_friends.user_id
  order by
  u.username;

end proc_main #

delimiter ;

-- TEST DATA

insert into users (username) values ('f00'),('bar'),('alpha'),('delta'),('omega'),('theta');

call insert_user_friend(1,2);
call insert_user_friend(1,3);
call insert_user_friend(1,4);
call insert_user_friend(1,1); -- oops

call insert_user_friend(2,1);
call insert_user_friend(2,5);

call insert_user_friend(4,1);

call insert_user_friend(6,1);

-- TESTING (call these sproc from your php !)

call list_user_friends(1);

call list_all_friends_of_user(1);