0

我有 2 张桌子,trophies_list 和 trophies_won。我想先列出所有已赢得的奖杯,然后按随机顺序列出所有未赢得的奖杯。我已经搜遍了,但没有运气。

我的桌子...

trophies_won

trophy_id获胜者
ID

奖杯列表

trophy_id
奖杯名

澄清一下,我希望列出所有奖杯,但首先显示出现在“trophies_won”中的奖杯和选择的“winners_id”,然后以随机顺序显示其余奖杯。

4

1 回答 1

1

你需要一个外连接

如果您不关心“赢得”奖杯出现的顺序,您可以非常简单地执行以下操作(因为winner_idNULL针对那些尚未赢得的奖杯,并且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()增加不必要开销的部分)。

于 2012-04-22T23:58:46.693 回答