0

我试图弄清楚如何进行查询以从他们的用户名中检索两个用户记录,前提是它们一起具有“双重配置文件”。

我的表看起来像:

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 中检索它。

这甚至可能吗?

编辑:如果更改表结构能够使其更高效,我对此很满意。

4

1 回答 1

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 注入。(我只是使用您在 url 中的内容,但在将其传递给数据库之前,您需要确保它是安全的。)

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 fiddle,或者检查我的数据库是否正确。 http://sqlfiddle.com/#!2/a5acc/12

于 2013-04-24T15:23:26.663 回答