MySql我朋友的朋友和我朋友之友的朋友

时间:2012-12-16 08:14:49

标签: mysql

我遇到mysql查询问题,无法以任何方式完成。我已经检查了其他主题,但无法在我的案例中找到任何解决方案。

我有2个表,一个是用户

id, name, email....

和朋友的第二个被命名为朋友:)

user1_id, user2_id

现在我需要从数据库中获取我朋友的朋友和下一级朋友的朋友,朋友的朋友,我的朋友的朋友,这些应该是2个单独的查询。当然搜索应该排除我,并且是不同的。

1 个答案:

答案 0 :(得分:0)

应该使用StoredProcedure这样的

来完成
CREATE PROCEDURE `friend_list`(user_id INT, MaxLevel INT)
LANGUAGE SQL
NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN

DECLARE LLevel, LCount INT DEFAULT 0;

DROP TABLE IF EXISTS tmp_friends;

CREATE TEMPORARY TABLE tmp_friends
    SELECT user1_id AS friend_id, LLevel AS friend_level
        FROM friends
        WHERE user2_id = user_id
    UNION
    SELECT user2_id, LLevel
        FROM friends
        WHERE user1_id = user_id;

SELECT COUNT(*) INTO LCount FROM tmp_friends;

DROP TABLE IF EXISTS tmp_fr;

WHILE ( LCount > 0 ) AND ( LLevel < MaxLevel ) DO

    SET LLevel = LLevel + 1;

    CREATE TEMPORARY TABLE tmp_fr
        SELECT user1_id as friend_id, LLevel as friend_level
        FROM friends
        WHERE user2_id IN ( SELECT friend_id FROM tmp_friends WHERE friend_level = LLevel - 1 );

    INSERT INTO tmp_fr
        SELECT user2_id as friend_id, LLevel as friend_level
        FROM friends
        WHERE user1_id IN ( SELECT friend_id FROM tmp_friends WHERE friend_level = LLevel - 1 );

    DELETE FROM tmp_fr 
    WHERE friend_id IN ( SELECT friend_id FROM tmp_friends ) 
       OR friend_id = user_id;

    SELECT COUNT(*) INTO LCount FROM tmp_fr;

    INSERT INTO tmp_friends
        SELECT * FROM tmp_fr;

    DROP TABLE tmp_fr;

END WHILE;

SELECT * 
FROM tmp_friends 
ORDER BY friend_level;

DROP TABLE tmp_friends;

END

您将获得一个包含用户的id和朋友级别的结果集(0是直接的,朋友的1位朋友,...)。

您只需传递user_id和最大友元级别

即可
CALL friend_list( 1, 10 );

我使用了这个表结构

CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

CREATE TABLE `friends` (
  `user1_id` int(11) unsigned NOT NULL,
  `user2_id` int(11) unsigned NOT NULL,
  PRIMARY KEY (`user1_id`,`user2_id`),
  KEY `fk_friends_users2` (`user2_id`),
  CONSTRAINT `fk_friends_users2` FOREIGN KEY (`user2_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
  CONSTRAINT `fk_friends_users1` FOREIGN KEY (`user1_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
相关问题