组合2个表,但首先显示所选行,然后以随机顺序显示其余表

时间:2012-04-22 23:49:27

标签: mysql

我有2张桌子,trophies_list和trophies_won。我想列出所有先获胜的奖杯,然后列出所有未以随机顺序获胜的奖杯。我一直在搜索,但没有运气。

我的桌子......

trophies_won

trophy_id
winner_id

trophies_list

trophy_id
trophy_name

为了澄清,我希望列出所有的奖杯,但是那些出现在'trophies_won'并且首先显示所选'winners_id'的奖杯,然后是其他随机顺序。

1 个答案:

答案 0 :(得分:1)

您需要outer join

如果您不关心“获胜”奖杯出现的顺序,您可以非常简单地执行以下操作(因为winner_id对于那些尚未获胜的奖杯将是NULLNULL is ordered "after" all other results in a descending order):

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()部分,这会增加不必要的开销)。