2011-07-25 101 views
3

我有一个表称为用户 此表是什么样子问题与MySQL查询

CREATE TABLE `users` (
    `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `username` varchar(32) NOT NULL, 
    `password` varchar(60) NOT NULL, 
    `email` varchar(60) NOT NULL, 
    PRIMARY KEY (`id`) 
) 

最后我有一个表叫朋友, 此表是什么样子

CREATE TABLE `friends` (
    `friendship_id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
    `user_id1` bigint(20) unsigned NOT NULL, 
    `user_id2` bigint(20) unsigned NOT NULL, 
    `time_created` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`friendship_id`), 
    KEY `user_id1` (`user_id1`), 
    KEY `user_id2` (`user_id2`), 
    CONSTRAINT `friends_ibfk_1` FOREIGN KEY (`user_id1`) REFERENCES `users` (`id`), 
    CONSTRAINT `friends_ibfk_2` FOREIGN KEY (`user_id2`) REFERENCES `users` (`id`) 
) 

所以基本上如果userA跟随userB,那么一行将被添加到friends表中,属性user_id1是userA,user_id2是userB。

即时通讯试图编写一个搜索框的MySQL查询。用户将输入一个字符串,查询将抓取包含该字符串的用户列表,但用户所关注的人员需要首先显示。

所以如果我们有3个用户

  • 插孔
  • 杰森
  • 约翰

如果用户Chris(谁在关注杰森)在搜索框输入字符串 'JA',该查询将按照jason,jack的顺序抓取用户列表。因为杰森跟随克里斯。

从我的理解,我想可能一组由问题,我尝试了不同的查询,但我不能得到所需要的结果

做你们有什么想法?

非常感谢

+0

我真的不得到你的问题,你想改变结果的顺序,或者你需要给已有的友谊作为第一行?显示你运行什么查询来获取用户。 – Tim

+0

我只是想抓取用户从数据库,但我想要的朋友先显示,然后非朋友 –

回答

2

你必须为分类做了一招,让友谊得到一个0和非友谊在临时场拿到1,然后我们升序排列此字段和第二我们排序用户名

SELECT x.username 
FROM users x LEFT JOIN friends y ON x.id=y.user_id2 AND y.user_id1=$LOGGED_IN_USER 
WHERE LOWER(x.username) LIKE 'ja%' 
ORDER BY CASE WHEN y.user_id2 IS NULL THEN 1 ELSE 0 END,x.username 

@thanks到scwagner指着我延长JOIN子句

+1

在JOIN一定要包括“和y_user_id1 = $(LoggedInUserId)”,否则如果任何人有一个朋友匹配的名称那么你会把它们排在最前面。 – scwagner

+0

感谢您的答案@rabudde 我试过你的查询,但我没有工作 这里是错误 错误1064(42000):你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'WHERE LOWER(t.username)LIKE'ha%' ORDER BY CASE WHEN y'user_id2 IS NULL THEN 1'在第1行附近使用正确的语法 –

+1

抱歉,在ORDER BY-clause中有一个AS order_field,请删除它(或者参考编辑答案) – rabudde