只有在另一个表中有共同记录时才从其用户名中检索两个用户记录

时间:2013-04-24 11:15:19

标签: mysql join

我试图找出如何通过用户名来检索两条用户记录的查询,只要它们一起有“双重配置文件”。

我的表格如下:

doubles =>
  id
  user_1
  user_2
  profile_text

users =>
  id
  username
  url_username
  birthdate
  and so on

说我在双打表中有这个记录:

id    user_1    user_2         profile_text
5       14        16      Welcome to our profile

假设我在用户表中有这两条记录(包括许多其他记录):

id   username   url_username   birthdate
14    John         john        1990-05-09
16     Bob          bob        1991-07-04

当用户访问www.mysite.com/double/john/bob时,我想要检索2个用户,但前提是他们在双打表中有记录(不关心他们的ID是在user_1还是user_2) 。 url_username是在url中输入的内容(此列的原因是我有替换为url的丹麦字母),并且我从url中检索此内容。

这甚至可能吗?

编辑: 如果改变表格结构可以使它更有效率,我很擅长。

1 个答案:

答案 0 :(得分:1)

我没有构建你的表来测试它,但我认为这个查询应该有效:

select * from users, doubles where (doubles.user_1 = users.id or doubles.user_2 = users.id) and users.url_username = 'THEUSERNAME';
我在where子句中使用了url_username,假设你已经有了解析url的方法。我会说最好使用一个实际的用户ID。

好的,这是一个使用连接的查询,我认为可以实现你想要的。 (连接比子查询更快,如果可能,首选。)

至于速度有多快,你必须对其进行测试,这显然取决于你正在查看的记录数量。请注意,此查询没有做任何事情来保护您免受sql注入。 (我只是使用你在网址中提供的内容,但在将其传递到数据库之前,你需要确保它是安全的。)

select 
  d.* 
from 
  users u1, 
  doubles d, 
  users u2 
where 
  (
    (d.user_1 = u1.id and d.user_2 = u2.id)
   or
    (d.user_1 = u2.id and d.user_2 = u1.id)
  )
and 
  (u1.url_username = 'john' and u2.url_username='bob');
如果你想玩它,我在这里做了一个sql小提琴,或检查我的数据库是否正确。 http://sqlfiddle.com/#!2/a5acc/12