0

我正在尝试通过从数据库中随机选择两个可用用户然后使它们不可用(因此无法再次选择它们)来创建一个配对两个可用用户的应用程序。

我想知道如何选择它们然后将它们配对?

我有以下数据库结构。

USERS
| id        | autoincrement, primary key
| user_id   | user's ID
| connected | available, connecting, chatting


ROOMS
| id        | 
| room_name | 
| room_id   | 
| user_id   | first user connected
| user_id2  | second user connected

我不是在制作房间,我只是在尝试配对用户并将他们发送到房间。

4

3 回答 3

1

你的意思是加入记录?

您可以执行以下操作:

select * from rooms as r
left outer join users as u on r.user_id=u.id
left outer join users as u2 on r.user_id2=u2.id
where r.id=123

123 = 房间 ID。

编辑:

这是一种使用两个随机用户更新房间记录的方法

UPDATE rooms
SET 
user_id=(SELECT id FROM users ORDER BY RAND() LIMIT 0,1),
user_id2=(SELECT id FROM users ORDER BY RAND() LIMIT 0,1),
where id=123

我已经对此进行了测试,它似乎有效。这将防止您拥有重复的用户:

UPDATE rooms
SET 
user_id=(SELECT u1.id FROM users as u1 ORDER BY RAND() LIMIT 0,1),
user_id2=(SELECT u2.id FROM users as u2 where user_id <> u2.id ORDER BY RAND() LIMIT 0,1)
where id=123
于 2012-10-04T05:42:20.380 回答
0

SELECT可能是这样的:

SELECT user_id
FROM `USERS`
WHERE connected = 'available'
ORDER BY RAND()
LIMIT 2;

您需要解析结果集并将 user_ids 分配给变量,例如

$user_id1
$user_id2

第一个UPDATE是这样的:

UPDATE `USERS` 
SET connected = 'connecting'
WHERE user_id IN ($user_id1,$user_id2);

INSERT看起来像这样:

INSERT INTO `ROOMS` (room_name,room_id,user_id,user_id2)
VALUES ($room_name,$room_id,user_id,user_id2);

最后最后一个UPDATE

UPDATE `USERS` 
SET connected = 'connected'
WHERE user_id IN ($user_id1,$user_id2);

尽管您可能想要锁定行,但我还没有掌握数据库管理的那一部分。出于您的目的,您可能需要对其进行调查。

于 2012-10-04T06:01:28.070 回答
0

据我说,你需要三个表而不是两个来实现你的逻辑。

考虑我的数据库架构

USERS
| id        | autoincrement, primary key
| user_id   | user's ID
| connected | available, connecting, chatting

ROOMS
| id        | 
| room_name | 

USERCHAT
| id        |
| user_id   | user's ID
| room_id   | room id

要获得配对,您可以执行以下查询。

SELECT user_id 
FROM USERS 
WHERE id NOT IN (SELECT user_id FROM USERCHAT)
ORDER BY RAND()
LIMIT 2;

选择用户后,您可以简单地将它们插入 ROOMS 和 USERCHAT 表中。使用此模式,您还可以允许多个用户而不是两个用户进行聊天。

于 2012-10-04T06:08:42.453 回答