【问题标题】:Mysql/php randommysql/php 随机
【发布时间】:2014-01-02 23:00:00
【问题描述】:

我想随机选择我桌子上的一些物品

所以我有这张桌子:

ID_TEAM  #  NAME_TEAM
1            CHELSEA
2            MANU
3            MANC
4            LIVERPOOL
5            ARSENAL

我的问题是在这支球队之间随机进行一场比赛

Chelsea vs MANU
MANU vs MANC
LIVERPOOL vs Arsenal
Manu vs Liverpool
Chelsea vs MANC
...

我希望所有球队都互相比赛...我可以随机进行吗?如果没有,我可以选择什么?谢谢 !

【问题讨论】:

  • 你想要这个在 MySql 端吗?在 php 端可能会容易得多。
  • 我想在 php 端这样做。我还想当我做这种随机时,我得到球队的 ID_TEAM 就像这样 CHELSEA VS LIVERPOOL (value=1) vs (value=4) 你明白吗?
  • 你真的需要随机吗?如果它重复游戏怎么办?根据您真正想做的事情,而不是随机匹配,我更愿意创建所有匹配,例如:$team1 vs $team2; $team3 vs $team4; $team5 vs $team1 并且我会随机选择哪个是 $team1,哪个是 $team2 等等。跨度>

标签: php mysql random


【解决方案1】:

你可以在 MySQL 中使用CROSS JOIN 和表本身一样

SELECT team1.name as 'team1', team2.name as 'team2' from team_table AS team1
    CROSS JOIN team_table AS team2
WHERE team1.name <> team2.name
    AND team1.id < team2.id;

这里有一个 SQL Fiddle 页面向您展示它是如何工作的

只需使用 PHP 执行它,您就可以处理返回的数据,如果您希望它是随机的,您拥有整个结果集,将其格式化为数组并使用 array_rand

编辑:已修复 Jonny 5 先生(无法抗拒)指出的缺陷,更新后的查询现在过滤相同匹配,如 1 VS 1 和反向匹配,如 1 VS 55 VS 1,但是你仍然会加载每个在这种情况下,您可以将返回的数据格式化为这样的数组

$matchings = array(id => array(team1,team2))

这样您就可以访问像$matchings[0][0] 用于第一队和$matchings[0][1] 用于第二队的团队,以获取随机匹配,您可以使用array_rand 或使用rand(0,count($matchings)-1) 获取随机ID

【讨论】:

  • 这会给你比你想要的更多的匹配,例如1 vs 5 + 5 vs 1 并且没有随机的l &lt;-&gt; r
  • @Jonny5 感谢您指出这一点,我已经修复了代码
【解决方案2】:

检查一下,如果这会做你喜欢的事情并重新加载页面几次,看看随机组合。

// example array, set it with data from your db
// where key = (int)$row['team_key'] and value = $row['team_name']
$teams = array(
1 => "CHELSEA",
2 => "RED BULL",
3 => "MANCHESTER",
4 => "LIVERPOOL",
5 => "ARSENAL");

// generate random team-matches
// ------------------

$team_matches = array();
$team_keys = array_keys($teams);

shuffle($team_keys);

foreach($team_keys AS $v)
{
  foreach($team_keys AS $v2)
  {
    if(($v != $v2) && !in_array($v2."_".$v,$team_matches)) {
      $team_matches[] = $v."_".$v2;
    }
  }
}

shuffle($team_matches);

// test output
// ------------------

echo "<pre>"; 

// teams
echo "Teams: "; print_r($teams); echo "\n";

// helper
#echo "Matches: "; print_r($team_matches); echo "\n";

// print matches
echo "\nTeam matches:\n"; 
foreach($team_matches AS $v)
{
  $match_ids = array_map("intval",explode("_",$v));

  // opponents: $match_ids[0] vs $match_ids[1]
  echo $match_ids[0]." vs ".$match_ids[1]." --- ".$teams[$match_ids[0]]." vs ".$teams[$match_ids[1]]."<br />";
}

echo "</pre>";

示例输出:

Teams: Array
(
    [1] => CHELSEA
    [2] => RED BULL
    [3] => MANCHESTER
    [4] => LIVERPOOL
    [5] => ARSENAL
)

Team matches:
3 vs 1 --- MANCHESTER vs CHELSEA
1 vs 5 --- CHELSEA vs ARSENAL
3 vs 5 --- MANCHESTER vs ARSENAL
1 vs 2 --- CHELSEA vs RED BULL
2 vs 5 --- RED BULL vs ARSENAL
3 vs 4 --- MANCHESTER vs LIVERPOOL
4 vs 5 --- LIVERPOOL vs ARSENAL
3 vs 2 --- MANCHESTER vs RED BULL
2 vs 4 --- RED BULL vs LIVERPOOL
1 vs 4 --- CHELSEA vs LIVERPOOL

重新加载/运行洗牌队伍的脚本。

【讨论】:

  • 感谢您提供此解决方案@Jonny
【解决方案3】:

请试试这个sqlFiddle

SELECT T1.id_team as team1ID,T1.name_team as team1Name,
       T2.id_team as team2ID,T2.name_team as team2Name,
       CONCAT(T1.id_team,' vs ',T2.id_team) as id_vs,
       CONCAT(T1.name_team,' vs ',T2.name_team) as name_vs
FROM team T1,team T2
WHERE T1.id_team < T2.id_team
ORDER BY rand()

你会得到一个5 choose 2 (10) 行 每支球队都有机会与其他 4 支球队交手。

如果您想要让第一支球队代表主场比赛的比赛,您也可以使用 sqlFiddle 进行随机化,我所做的只是选择一个随机数,然后根据该随机数混合 team1、team2

SELECT @rand := rand() as randValue,
       IF (@rand > 0.5,T1.id_team,T2.id_team) as team1ID,
       IF (@rand > 0.5,T1.name_team,T2.name_team) as team1Name,
       IF (@rand > 0.5,T2.id_team,T1.id_team) as team2ID,
       IF (@rand > 0.5,T2.name_team,T1.name_team) as team2Name,
       IF (@rand > 0.5,CONCAT(T1.id_team,' vs ',T2.id_team),
                       CONCAT(T2.id_team,' vs ',T1.id_team)) as id_vs,
       IF (@rand > 0.5,CONCAT(T1.name_team,' vs ',T2.name_team),
                       CONCAT(T2.name_team,' vs ',T1.name_team)) as name_vs
FROM team T1,team T2
WHERE T1.id_team < T2.id_team
ORDER BY rand()

如果您希望每支球队有一些客场比赛和一些主场比赛(让一支球队代表主场比赛),例如在这种情况下,每支球队将有 2 场主场比赛和 2 场客场比赛。你可以试试这个sqlFiddle

SELECT @row := @row+1 as randValue,
       IF (MOD(@row,2)=0,T1.id_team,T2.id_team) as team1ID,
       IF (MOD(@row,2)=0,T1.name_team,T2.name_team) as team1Name,
       IF (MOD(@row,2)=0,T2.id_team,T1.id_team) as team2ID,
       IF (MOD(@row,2)=0,T2.name_team,T1.name_team) as team2Name,
       IF (MOD(@row,2)=0,CONCAT(T1.id_team,' vs ',T2.id_team),
                         CONCAT(T2.id_team,' vs ',T1.id_team)) as id_vs,
       IF (MOD(@row,2)=0,CONCAT(T1.name_team,' vs ',T2.name_team),
                         CONCAT(T2.name_team,' vs ',T1.name_team)) as name_vs
FROM team T1,team T2,(SELECT @row:=0)variable
WHERE T1.id_team < T2.id_team
ORDER BY rand()

【讨论】:

  • 非常感谢!我试试这个!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多