MySQL查询:加入和分组

时间:2009-09-18 18:21:16

标签: sql database mysql performance

我有一个简单的比赛注册网络表单。每位参赛者都可以选中一个方框,有资格赢得20个奖项中的一个。提交表单后,会在“参赛者”表格中创建一行。对于他们检查过的每个奖品,都会在“条目”表格中创建一行。

我正在尝试制作一个“结果”页面,列出所有奖品名称,并在每个奖品名称下面列出所有希望有资格赢得该奖项的参赛者。没有参赛者签名的奖品将不会在其名字下面列出参赛者。

如何编写高效的MySQL查询以轻松生成此类页面(使用PHP)?

参赛者

  • ID
  • 名称
  • 电子邮件
  • 地址
  • 城市
  • 状态

  • ID
  • contestant_id
  • prize_id

奖品

  • ID
  • 名称
  • 描述

1 个答案:

答案 0 :(得分:3)

SELECT p.name AS prize, c.name AS contestant FROM contestants c
INNER JOIN entries e ON c.id = e.contestant_id
INNER JOIN prizes p ON e.prize_id = p.id
ORDER BY p.id

它会给你结果:

prize 1 | contestant 1.1
prize 1 | contestant 1.2
...
prize 1 | contestant 1.n
prize 2 | contestant 2.1
prize 2 | contestant 2.2
...
prize 2 | contestant 2.n
....
prize m | contestant m.n

如果你想拥有这样的清单:

prize 1
    contestant 1.1
    contestant 1.2
    ...
    contestant 1.n  
prize 2
    contestant 2.1
    contestant 2.2
    ...
    contestant 2.n

您必须使用PHP格式化结果。

可能是这样的:

$old_prize = '';

$result = mysql_query(<above query>);

while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

    if($old_prize != $row["prize"]) {
        $old_prize = $row["prize"];
        echo "Prize: ".$row["prize"].'<br />'; 
    }

    echo $row["contestant"].'<br />;
}