0

私は2つのテーブルを持っています:teamsformations:

テーブルチーム:

team_id | team_name
   1    | Barcelona
   2    | Real Madrid
   3    | PSG

テーブルフォーメーション:

formation_id | team_id | module
    1        |    2    | 5-3-2
    2        |    1    | 4-4-2
    3        |    3    | 4-4-2
    4        |    2    | 4-4-3

実際には、2 つのテーブル GROUP BY team_id の間で「結合」する必要がありますが、最後の「formation_id」を使用します。

結果は次のようになります。

 team_id | team_name  | formation_id  | module
    1    | Barcelona  |     2         |  4-4-2
    2    | Real Madrid|     4         |  4-4-3
    3    | PSG        |     3         |  4-4-2 

実際、私のクエリは次のとおりです。

SELECT *
  FROM formations f
 INNER JOIN teams t 
    ON (f.team_id = t.team_id)
 GROUP BY t.team_id

このクエリでは、各チームの最初のインサート フォーメーションを選択しましたが、代わりに各チームの最後のフォーメーションを選択する必要があります。

4

7 に答える 7

1

後で元のテーブルと結合するサブクエリを使用して、最大フォーメーション ID を見つけることができます。これを試して、

SELECT  a.*, c.formation_ID, c.`module`
FROM    teams a
        INNER JOIN
        (
            SELECT team_id, MAX(formation_ID) maxID
            FROM formations
            GROUP BY team_ID
        ) b ON  a.team_id = b.team_id
        INNER JOIN formations c
            ON  c.team_id = b.team_id AND
                c.formation_ID = b.maxID
ORDER BY a.Team_id

SQLFiddle デモ

于 2012-09-20T00:36:05.950 に答える
1

あなたは書ける:

SELECT t.team_id,
       t.team_name,
       f.formation_id,
       f.module
  FROM teams t
  JOIN formations f
    ON f.team_id = t.team_id
       -- require f.formation_id to be MAX(formation_id) for some team:
  JOIN ( SELECT MAX(formation_id) AS id
           FROM formations
          GROUP
             BY team_id
       ) max_formation_ids
    ON max_formation_ids.id = f.formation_id
;

また:

SELECT t.team_id,
       t.team_name,
       f.formation_id,
       f.module
  FROM teams t
  JOIN formations f
    ON f.team_id = t.team_id
       -- require f.formation_id to be MAX(formation_id) for this team:
 WHERE f.formation_id =
        ( SELECT MAX(formation_id)
            FROM formations
           WHERE team_id = t.team_id
        )
;

また:

SELECT t.team_id,
       t.team_name,
       f.formation_id,
       f.module
  FROM teams t
  JOIN formations f
    ON f.team_id = t.team_id
       -- forbid f.formation_id to be less than another for the same team:
  LEFT
 OUTER
  JOIN formations f2
    ON f2.team_id = t.team_id
   AND f2.formation_id > f.formation_id
 WHERE f2.formation_id IS NULL
;
于 2012-09-19T18:52:44.583 に答える
1

このSQLFIDDLEを確認してください

SELECT A.team_id,A.team_name,B.formation_id,B.module
FROM teams A,formations B
WHERE A.team_id=B.team_id
AND B.formation_id =
(
  SELECT max(formation_id)
  FROM formations C
  WHERE C.team_id =B.team_id
 )
ORDER BY A.team_id;


create table teams
(  
  team_id int
 ,team_name varchar(40)
);
create table formations 
(
  formation_id int
 ,team_id  int
 ,module int
);
insert into teams
values
(1,'Barcelona'),(2,'Real Madrid'),(3,'PSG');
insert into formations
values
(1,2,532),(2,1,442),(3,3,442),(4,2,443);
于 2012-09-19T19:17:23.890 に答える
0

このバージョンでは、内部ソートが発生することが多い集計なしで同じ結果が生成されます。

SELECT t.team_id,
   t.team_name,
   f.formation_id,
   f.module
FROM teams t
INNER JOIN formations f
    ON f.team_id = t.team_id
LEFT OUTER JOIN formations f2
    ON f2.team_id = t.team_id
   AND f2.formation_id > f.formation_id
WHERE f2.formation_id IS NULL
于 2012-09-19T19:03:36.580 に答える
0

SQL 仕様では、group by 句を使用する場合、出力内のすべてのフィールド/式は、集計関数 (count、avg など) の結果か、group by 句にリストされたフィールドのいずれかである必要があると規定されています。それ以外の場合、動作は定義されていません。したがって、このレコードを正確に選択する必要がある場合は、クエリにいくつかの基準を追加する必要があります。また、単純な「select * from some_table」が常に同じ順序で行を返すという保証はありません。

于 2012-09-19T18:54:36.863 に答える
0
create table teams (team_id integer, team_name varchar(50));
create table formations (formation_id integer, team_id integer, module varchar(20));

insert into formations (formation_id, team_id, module) values
(1, 2, '5-3-2'),
(2, 1, '4-4-2'),
(3, 3, '4-4-2'),
(4, 2, '4-4-3')
;

insert into teams (team_id, team_name) values
(1, 'Barcelona'),
(2, 'Real Madrid'),
(3, 'PSG')
;

select t.team_id, team_name, f.formation_id, module
from
    formations f
    inner join
    teams t on f.team_id = t.team_id
    inner join (
        select team_id, max(formation_id) as formation_id
        from formations
        group by team_id
    ) s on s.team_id = t.team_id and s.formation_id = f.formation_id
order by t.team_id
;
+---------+-------------+--------------+--------+
| team_id | team_name   | formation_id | module |
+---------+-------------+--------------+--------+
|       1 | Barcelona   |            2 | 4-4-2  |
|       2 | Real Madrid |            4 | 4-4-3  |
|       3 | PSG         |            3 | 4-4-2  |
+---------+-------------+--------------+--------+
于 2012-09-19T18:57:48.223 に答える
0

次のようなことができます。

select f.*, t.team_name from formations f
  join (select team_id, max(formation_id) as max_formation_id from formations f 
          group by team_id) as mrf on mrf.max_formation_id = f.formation_id
  join teams t on f.team_id = t.team_id
于 2012-09-19T18:56:36.677 に答える