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

标签 mysql

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

相关文章:

java - 如何将jdatechooser中的日期值插入到数据库表中

mysql 测试时间是否在午夜以上的时间范围内

mysql - 为什么mysql innodb改变表结构时可以更新数据?

php - 自动更改记录

mysql - SQL - 如何使用 AND 运算符在使用 JOIN 后起作用

mysql - MySQL表行是否包含两个值

php - 无法获取等于 0 的数据

php - sql查询帮助? sql新手问题

php - MySQL可以同时选择和设置吗?

mysql - 如何在 Crystal 报表中显示所有记录