2011-11-27 85 views
3

奥凯我的网站工作与Facebook的API,这将导入将在,所以我的表结构会记录用户的所有朋友(用户ID,名称)如下:合并两个查询一起

users: id, name 
usersFriends: id, friendUserId, name 

所以当用户加入的网站,他们将得到导入的所有朋友,例如数据:

user: 237374734 (facebook user id), John brouwers (name of the user) 

然后将导入约翰的各界朋友。例如:

userFriends: 237374734 (John user id), 2737373, Michael jackson 

现在我需要的是,将搜索(按名称)查询过的朋友,这是 只需参加没问题,但我需要的是在查询中我需要检查无论用户是在我的网站上,以便让我们的例子:

我们登录时使用的用户约翰,我们正在寻找迈克尔所以这将是

SELECT name FROM userFriends WHERE name LIKE %michael% 

但我需要的不仅是回报用户的名字,我也需要检查用户是否存在s在用户表中。

对不起,长期以来,希望我的问题是明确的。谢谢!

+0

如果您想快速解决问题,请放上您的表格结构。 –

+0

添加了表格结构。 – user1066101

+0

你给友谊命名?好的... –

回答

3

编辑:所以你需要通过名称搜索朋友,并检查users表中是否存在朋友的查询,如下所示:

create table Users(
    Id int not null, 
    primary key (Id), 
    Name varchar(50) not null 
)TYPE=MyISAM; 
create table UserFriends(
    Id int not null, 
    foreign key (Id) references Users(Id), 
    FriendUserId int not null, 
    Name varchar(50) not null 
)Type=MyISAM; 
insert into Users(Id,Name) values(237374734,'John brouwers'); 
insert into UserFriends(Id,FriendUserId,Name) 
values(237374734, 2737373, 'Michael jackson'); 

这里为q uery将搜索发售者,他的名字like "%Michael%"和检查,如果他是一个注册用户或不:

select s.Id, s.Name, 
     case when exists 
     ( 
      select Name from users where Name like "%Michael%" 
     ) Then 'Registered User' 
     else 
     (
      'Not Registered' 
     ) 
     end 
     as 'Is Registered in My Website' 
from 
(
     select uf.FriendUserId Id, uf.Name 
     from UserFriends uf 
     left join users u on u.Id = uf.friendUserId 
     where uf.name like "%Michael%" 
) s 

这将会为您提供:

Id    Name  Is Registered in My Website 
2737373 Michael jackson  Not Registered 

希望这将是有益的,如果有任何问题都毫不犹豫地问。

+0

正是感谢! – user1066101

+0

这就是我要去的地方。但查询输出应该是这样的:array('id','name','onWebsite'),所以'onWebsite'应该在查询中被选中,我该怎么做? – user1066101

+0

我编辑了我的答案。 –

2
Select users.id 
from users join usersFriends on users.id = usersFriends.friendUserId 
where usersFriends.userId = ? 
+0

再次阅读问题,我不需要加入,我想检查朋友是否在用户表 – user1066101

1
select u.userId 
from users u, usersFriends uf 
where u.userId=uf.friendUserId and 
u.userId=? 

以某个研究http://en.wikipedia.org/wiki/Join_(SQL)。这非常有用。

+0

我不需要加入查询,我需要一个查询,将获得用户的所有朋友和还要检查用户表中是否存在该朋友记录 – user1066101

+0

我更新了示例以显示它的工作原理,您只需要对其进行测试。 –

1

您可以使用JOIN。考虑下面的示例查询:

SELECT u.id, u.name FROM users u, usersFriends uf 
WHERE uf.friendUserId = u.id 
AND uf.userId = ? 

像这样的查询应该工作,请记住,当我们不知道你有确切的字段名,你需要做一些调整。

UPDATE

To show you that it DOES work: 

create table users (id int, name varchar(100)); 
create table usersFriends (friendUserId int, userId int); 
insert into users values (1, 'name 1'), (2, 'name 2'), (3, 'name 3'); 
insert into usersFriends values (1, 7), (5, 7); 


mysql> SELECT u.id, u.name FROM users u, usersFriends uf 
    -> WHERE uf.friendUserId = u.id 
    -> AND uf.userId =7; 
+------+--------+ 
| id | name | 
+------+--------+ 
| 1 | name 1 | 
+------+--------+ 
+0

谢谢你的回答,但是,查询是不正确的,我需要一个查询,也将检查用户是否存在,你可能是一个朋友用户不在数据库中,你明白吗? – user1066101

+0

查询将执行此操作,这就是如何使用LEFT JOINT(如果您使用MySQL,则隐含在查询中)。它只会返回用户和用户表中存在的记录。 –

1

理想情况下,你将有你的usersFriends表和users表之间的外约束。这确保将始终存在对应的users记录。要建立外键,你需要确保你的表都InnoDB和添加约束,然后你可以使用:

ALTER TABLE usersFriends ADD FOREIGN KEY (friendUserId) REFERENCES users (id); 

否则,你可以使用一个连接

SELECT * 
FROM usersFriends f 
    JOIN users u on f.friendUserId = u.ID 
WHERE f.userId = ? 
+0

我知道我可以使用连接获取用户信息,但这不是我想要的,对不起,这个问题可能有点模糊,但我需要的是切入用户表中是否存在该朋友 – user1066101