gpt4 book ai didi

MySQL 选择 rand 并排除有条件的用户

转载 作者:行者123 更新时间:2023-11-29 12:30:34 26 4
gpt4 key购买 nike

我需要从“用户”表中选择随机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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com