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

时间:2014-12-22 11:49:38

标签: mysql

我需要从"用户"中选择随机user_id如果当前用户有任何正在进行的"表格,则完全排除任何user_id与他战斗battles.status

查询:

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

但是查询还不够,因为用户可以与特定的其他用户进行多次战斗,其中一个用户正在进行&#34;正在进行&#34;和其他人#34;完成&#34;, 我的查询应该从&#34;完成&#34;中选择用户行。

表格结构:

用户表:

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

如果&#34;我的&#34; id =&#34; 1&#34;,
我想完全排除我与他持续战斗的任何用户,例如&#34; 2&#34;在上述情况下并接受所有其他ID(即3,4和5)

1 个答案:

答案 0 :(得分:1)

你可能想要这样的内容:

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和随机排序返回其中一个,如示例所示。