我需要从“用户”表中选择随机user_id
,并且如果当前用户与他有任何“正在进行的”战斗,则完全排除任何
user_id
。状态
查询:
SELECT user.id
FROM user
LEFT JOIN battles b ON b.uid = user.id AND b.status <> 'ongoing'
WHERE user.id <> 1
ORDER BY RAND( )
LIMIT 1
但是查询还不够,因为一个用户可以与特定的其他用户进行多次战斗,其中一个“正在进行”,其他“已完成”, 我的查询应该从“完成”行中选择用户。
表结构:
用户表:
id name
1 John
2 Sarah
3 Jack
4 Andy
5 Rio
战斗表:
id uid uid2 status
1 1 2 finished
2 1 2 ongoing
3 2 3 ongoing
4 1 4 finished
5 3 5 finished
如果“我的”id =“1”,
我想完全排除我正在与他进行战斗的任何用户,例如上述情况中的“2”,并接受所有其他 id(即 3,4 和 5)
最佳答案
您可能想要类似这样的东西:
SELECT foe.*
-- Select yourself and join all other users to find potential foes
FROM `user` AS me
INNER JOIN `user` AS foe
ON (me.id <> foe.id)
-- Here we select the active user
WHERE me.`id` = 1
-- Now we exclude foes we have ongoing battles with
-- (your id could be in either uid or uid2)
AND foe.`id` NOT IN (
SELECT `uid` FROM `battles`
WHERE `uid2` = me.`id` AND `status` = 'ongoing'
UNION ALL
SELECT `uid2` FROM `battles`
WHERE `uid` = me.`id` AND `status` = 'ongoing'
);
这将返回当前未与您进行战斗的用户列表。您可以自定义此设置,使用 LIMIT 和随机排序仅返回其中之一,如示例中所示。
关于MySQL 选择 rand 并排除有条件的用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27602138/