0

次のクエリを使用して、チームの過去 20 試合のセットを取得しています。過去 20 試合で得点したゴールを見つけて、結果を (ゴール、日付) で並べ替えたいと思います。

SELECT * FROM (
     SELECT *, `against` AS `goalsF` , `for` AS `goalsA`
     FROM `matches` , `teams` , `outcomes`
     WHERE(
     `home_team_id`=7 AND `matches`.away_team_id = `teams`.team_id
     OR 
     `away_team_id`=7 AND `matches`.home_team_id = `teams`.team_id
     )
     AND `matches`.score_id = `outcomes`.outcome_id
     ORDER BY `date` DESC
     LIMIT 0 , 20
     ) res
ORDER BY `goalsF`

問題はそれです:

  • 検索しているチームがホーム チームの場合、「goalsfor」をカウントする必要があります。
  • チームがアウェイ チームにいる場合、ゴールを見つけるために「goalsagainst」をカウントする必要があります。

だから私ができるようにする必要があるのは次のようなものです:

if (`home_team_id`=7 AND `matches`.away_team_id = `teams`.team_id) 
 SELECT *, `for` AS `goalsF` , `against` AS `goalsA`


if (`away_team_id`=7 AND `matches`.home_team_id = `teams`.team_id) 
 SELECT *, `against` AS `goalsF` , `for` AS `goalsA`

ただし、これはサブセットまたは結果に対して実行する必要があります。これが可能かどうかはわかりませんが、MYSQL に関する私の知識を超えています。

どんな助けでも大歓迎です。

アラン。

4

1 に答える 1

2

まず、条件を節ではなく節joinに入れるANSI 標準構文を実際に学ぶ必要があります。また、エイリアスを使用すると、クエリがはるかに読みやすくなります。joinonfrom

以下は、チーム名が含まれていませんが、必要なロジックを実行します。

SELECT *
FROM (SELECT *,
             (case when m.home_team_id = 7 then o.against end) as `goalsF` ,
             (case when m.away_team_id = 7 then o.`for` end)  as `goalsA`
      FROM `matches` m join
           `outcomes` o
           on m.score_id = o.outcome_id
      WHERE m.home_team_id = 7 or m.away_team_id = 7
      ORDER BY `date` DESC
      LIMIT 0 , 20
     ) res
ORDER BY `goalsF`

チーム名を取得するには、teamsテーブルに 2 回参加する必要があります。1 回はホーム チーム用、もう 1 回はアウェイ チーム用です。これは、サブクエリ内またはその後で行うことができます。選択する列を明示的に言及し、すべての列参照にテーブル エイリアスを含めることもお勧めします。

SELECT *
FROM (SELECT m.*, o.*,
             homet.team_name as hometeam_name, awayt.team_name as away_team_name,
             (case when m.home_team_id = 7 then o.against end) as `goalsF` ,
             (case when m.away_team_id = 7 then o.`for` end)  as `goalsA`
      FROM `matches` m join
           `outcomes` o
           on m.score_id = o.outcome_id join
           teams homet
           on homet.team_id = m.home_team_id join
           teams awayt
           on awayt.team_id = m.away_team_id
      WHERE m.home_team_id = 7 or m.away_team_id = 7
      ORDER BY `date` DESC
      LIMIT 0 , 20
     ) res 
ORDER BY `goalsF`

編集:

チーム 7 のゴールのみを取得するには、次を使用できます。

             (case when m.home_team_id = 7 then o.`for`
                   when m.away_team_id = 7 then o.against
              end) as goals

他のチームのゴールを獲得するには:

             (case when m.home_team_id = 7 then o.against
                   when m.away_team_id = 7 then o.`for`
              end) as goals

編集II:

「他の」チーム名を取得する場合のロジックも同様です。のチーム名の参照を次のように置き換えますselect

             (case when m.home_team_id = 7 then awayt.team_name
                   when m.away_team_id = 7 then homet.team_name
              end) as goals
于 2013-07-03T10:42:55.430 に答える