1

私のSQLはこれに達していませんが、SQLの達人にとっては簡単だと確信しています-ロジックをPHPスクリプトに入れるよりも、正しいクエリを見つけたいです...

1 つのテーブルには、クラブ、特定の試合、およびその試合にクラブがエントリーしたチーム数に関する情報が含まれています。2 番目のテーブルは、エントリを「部門」に分割します。

すなわち

mysql> describe Entries;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| ClubId   | int(11) | NO   | PRI | NULL    |       |
| MatchId  | int(11) | NO   | PRI | NULL    |       |
| NumTeams | int(11) | NO   |     | NULL    |       |
+----------+---------+------+-----+---------+-------+
mysql> describe Divisions;
+----------+---------+------+-----+---------+-------+
| Field    | Type    | Null | Key | Default | Extra |
+----------+---------+------+-----+---------+-------+
| MatchId  | int(11) | NO   | MUL | NULL    |       |
| ClubId   | int(11) | NO   | MUL | NULL    |       |
| Team     | int(11) | NO   |     | NULL    |       |
| Division | int(11) | NO   |     | NULL    |       |
+----------+---------+------+-----+---------+-------+

サンプルデータ:

Entries:
1, 1, 1 (Club1, Match1, 1 team)
1, 3, 2 (Club1, Match3, 2 teams)

Divisions:
1, 1, 1, 1 (Club1, Match1, Team1 is in division 1)
1, 1, 2, 2 (Club1, Match1, Team2 is in division 2)
1, 2, 1, 1 (Club1, Match2, Team1 is in division 1)
1, 2, 2, 2 (Club1, Match2, Team2 is in division 2)
1, 3, 1, 1 (Club1, Match3, Team1 is in division 1)
1, 3, 2, 2 (Club1, Match3, Team2 is in division 2)

必要な結果:

1, 1, 1 (Club 1, Match1, Team1)
1, 3, 1 (Club1, Match3, Team1)
1, 3, 2 (Club1, Match3, Team2)

- so not all the rows in Divisions are in the result.
  e.g, club1, match1, team2 isn't here because there
  is only one entry in match 1.

Entries.NumTeams は、クラブがチームに参加したり、チームを削除したりすると、増減できるようになりました。新しいチームが参加すると、ディビジョン 1 に配置されます (常にディビジョンに所属するように)。チームが削除されても、ディビジョン テーブルのエントリは削除されません (ディビジョンは手動で設定されるため、誰かがクラブ X の 2 番目のチームがディビジョン 2 に属すると決定した場合、クラブ X がまだ 2 番目のチームに参加していなくても、その情報を保持する必要があります)。チーム)。

したがって、部門内のすべてのチームを印刷するには、次のようなものが必要です。

SELECT * FROM Divisions WHERE Divisions.Team <= Entries.NumTeams
    (for the Entries row with the matching match and club)

私はこれを試しました:

SELECT Divisions.* from Entries LEFT JOIN Divisions ON 
    Divisions.MatchId = Entries.MatchId AND Divisions.ClubId = Entries.ClubId 
    WHERE Divisions.Team <= Entries.NumTeams

しかし、私は重複した行になってしまいました。おそらく SELECT DISTINCT を使用してそれらを取り除くことができますが、最初からクエリが壊れていると思います。また、左右のテーブルを交換しましたが、それでも重複がありました。

明日、提供された回答を試します。ありがとう!

4

2 に答える 2

2

を使用DISTINCTすると重複行が削除され、クエリは問題ないようです。

于 2012-06-21T13:25:29.510 に答える
1

mysqlでdistinctを使用する

SELECT distinct Divisions.* from Entries LEFT JOIN Divisions ON 
    Divisions.MatchId = Entries.MatchId AND Divisions.ClubId = Entries.ClubId 
    WHERE Divisions.Team <= Entries.NumTeams
于 2012-06-21T13:20:48.863 に答える