2013-07-03 2 views
0

Я задаю следующий запрос, чтобы дать мне набор из 20 последних совпадений для команды. Я хочу найти их голов в последних 20 матчах и упорядочить результаты от (голов, дата):MySQL уточнение запроса

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` 

Проблема заключается в том, что:

  • если команда мы смотрим вверх является домашней командой, нам нужно считать «цели».
  • Если команда забирает гостей, нам нужно посчитать «goalagainst», чтобы найти их для целей.

Так что мне нужно, чтобы быть в состоянии сделать что-то вроде:

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.

Любая помощь была бы чрезвычайно оценена.

Alan.

+0

Вы знакомы с http://www.sqlfiddle.com/. Можете ли вы опубликовать свою структуру таблиц? – ntstha

+0

Я не знал о sqlfiddle - спасибо за хедз-ап –

ответ

2

Во-первых, вам действительно нужно выучить стандарт ANSI join синтаксис, где вы положили join условия в on пункте, а не п from. Кроме того, псевдонимы могут сделать запрос более читаемым.

Следующая делает логику, что вы хотите, хотя он не включает в себя названия команд:

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 столу, один раз хозяева один раз для команды гостей. Вы можете сделать это либо в подзапросе, либо позже. Это также хорошая идея оговаривая столбцы вы выбирающие и включить псевдоним таблицы на каждую ссылке колонки:

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` 

EDIT:

Чтобы получить только цели команды 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 

EDIT 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 
+0

Гордон, спасибо, ты. Я играю с этим за лучший паэт дня. Я буду внимательно изучать каждую строку вашего запроса, чтобы следовать вашему решению. Я очень ценю ваш вклад, спасибо! –

+0

SOmething не совсем прав. Я получаю две новые колонки в моем наборе результатов - GoalsF и GoalsA. Можно ли получить только GoalsF, который перечисляет цели в зависимости от того, была ли команда дома или вдали? –

+0

Я думаю, что это делает: CASE КОГДА m.home_team_id = 7 ТОГДА o.'against' ELSE o.'for' END –

Смежные вопросы