Запрос из одной таблицы относительно двух таблиц (MySQL)

0

Доброе утро. Ищете предложение.

У меня три таблицы:

совпадения | MatchID | MatchDateTime | и т.д.... | Внешний видID | Внешний видPlayerID | AppearanceMatchID замены | ПодстановкаID | ЗамещениеPlayerIDIn | SubstitutionMatchID

Я пытаюсь отобразить список совпадений в порядке дат, которые включали игрока X ($ id) в виде либо полного внешнего вида (содержащегося в появлении), либо внешнего вида (содержащегося в подстановках). Игрок не появился бы в матче, как в обоих.

Результат будет выглядеть примерно так:

matchid | matchdate   | type
1       | 2012-06-30  | (sub)
18      | 2012-07-10  | (full)
24      | 2012-07-17  | (full)
25      | 2012-07-24  | (full)
28      | 2012-07-31  | (full)
33      | 2012-09-05  | (sub)

Переменная $ id - это идентификатор проигрывателя, для которого я хочу отображать эти данные.

Есть несколько других таблиц, которые были включены в мою попытку ниже, которые есть, чтобы включить некоторые дополнительные данные сопоставления, но до сих пор это прогресс, который не возвращает строк. :/

SELECT
  M.MatchID AS matchid,
  DATE_FORMAT(M.MatchDateTime, '%b %D, %Y') AS time,
  DATE_FORMAT(M.MatchDateTime, '%d/%m/%y') AS date,
  M.MatchPlaceID AS place,
  M.MatchNeutral AS neutral,
  O.OpponentShort AS opponent,
  O.OpponentID AS oppid,
  MT.MatchTypeName AS matchtype,
  M.MatchAdditionalType AS add_type,
  M.MatchGoals AS goalsfor,
  M.MatchGoalsOpponent AS goalsagainst,
  M.MatchOvertime AS overtime,
  M.MatchPenaltyShootout AS penalties,
  M.MatchPenaltyGoals AS pensfor,
  M.MatchPenaltyGoalsOpponent AS pensagainst
FROM    
  matches M, opponents O, matchtypes MT, appearances A, substitutions S
WHERE
  (A.AppearanceMatchID = M.MatchID AND A.AppearancePlayerID = $id) OR 
  (S.SubstitutionMatchID = M.MatchID AND S.SubstitutionPlayerIDIn = $id) AND M.MatchOpponent = O.OpponentID AND M.MatchTypeID = MT.MatchTypeID
ORDER BY
  M.MatchDateTime DESC

Я использую MYSQL 5.6.

Теги:

1 ответ

1
Лучший ответ

Попробуй это

SELECT
  M.MatchID AS matchid
  DATE_FORMAT(M.MatchDateTime, '%b %D, %Y') AS time,
  DATE_FORMAT(M.MatchDateTime, '%d/%m/%y') AS date,
  M.MatchPlaceID AS place,
  M.MatchNeutral AS neutral,
  O.OpponentShort AS opponent,
  O.OpponentID AS oppid,
  MT.MatchTypeName AS matchtype,
  M.MatchAdditionalType AS add_type,
  M.MatchGoals AS goalsfor,
  M.MatchGoalsOpponent AS goalsagainst,
  M.MatchOvertime AS overtime,
  M.MatchPenaltyShootout AS penalties,
  M.MatchPenaltyGoals AS pensfor,
  M.MatchPenaltyGoalsOpponent AS pensagainst
FROM    
  matches M
inner join
  opponents O on M.MatchOpponent = O.OpponentID
inner join
  matchtypes MT on M.MatchTypeID = MT.MatchTypeID
left join
  appearances A on A.AppearanceMatchID = M.MatchID AND A.AppearancePlayerID = $id
left join
  substitutions S on S.SubstitutionMatchID = M.MatchID AND S.SubstitutionPlayerIDIn = $id 
WHERE
  (A.AppearanceID is not null) OR 
  (S.SubstitutionID is not null)
ORDER BY
  M.MatchDateTime DESC

и подумайте о том, как читать о объединениях, потому что, указав список таблиц, чтобы выбрать из них, а не явно присоединяться к ним, вы можете перейти к ситуации, когда MySQL будет выбирать перекрестное соединение

Ещё вопросы

Сообщество Overcoder
Наверх
Меню