我有 2 张桌子,trophies_list 和 trophies_won。我想先列出所有已赢得的奖杯,然后按随机顺序列出所有未赢得的奖杯。我已经搜遍了,但没有运气。
我的桌子...
trophies_won:
trophy_id获胜者
ID
奖杯列表:
trophy_id
奖杯名
澄清一下,我希望列出所有奖杯,但首先显示出现在“trophies_won”中的奖杯和选择的“winners_id”,然后以随机顺序显示其余奖杯。
我有 2 张桌子,trophies_list 和 trophies_won。我想先列出所有已赢得的奖杯,然后按随机顺序列出所有未赢得的奖杯。我已经搜遍了,但没有运气。
我的桌子...
trophies_won:
trophy_id获胜者
ID
奖杯列表:
trophy_id
奖杯名
澄清一下,我希望列出所有奖杯,但首先显示出现在“trophies_won”中的奖杯和选择的“winners_id”,然后以随机顺序显示其余奖杯。
你需要一个外连接。
如果您不关心“赢得”奖杯出现的顺序,您可以非常简单地执行以下操作(因为winner_id
将NULL
针对那些尚未赢得的奖杯,并且NULL
按降序排列“在”所有其他结果之后):
SELECT * FROM
trophies_list
NATURAL LEFT JOIN trophies_won
ORDER BY winner_id DESC, RAND();
当然,如果您说“所有未赢得的奖杯都应该按随机顺序排列”时,您的意思是您只是不关心顺序,您可以省略尾随的“ , RAND()
”。
更新
在回应您的评论时,我认为您实际上正在寻找类似的东西:
SELECT trophies_list.*, NOT ISNULL(trophies_won.winner_id) AS won FROM
trophies_list
LEFT JOIN trophies_won ON (
trophies_won.trophy_id = trophies_list.trophy_id
AND trophies_won.winner_id = 43
)
ORDER BY won DESC, RAND();
通过执行您所追求的标准的外部连接ON
,您可以在所有奖杯列表中识别出符合该标准和不符合该标准的奖杯。在这种情况下,指定的获胜者赢得了哪些奖杯,哪些没有。
然后,该ORDER BY
子句确保结果按已赢得的奖杯排列在前,然后是未赢得的奖杯;在这些层中,顺序是随机的(同样,如果您根本不关心顺序,您可以删除, RAND()
增加不必要开销的部分)。