私の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 を使用してそれらを取り除くことができますが、最初からクエリが壊れていると思います。また、左右のテーブルを交換しましたが、それでも重複がありました。
明日、提供された回答を試します。ありがとう!