2013-05-30 4 views
0

У меня есть таблица результатов спортивной команды MYSQL. Каждый матч или матч запоминают предмет с for и against голов за клик. То, что я хотел бы сделать, это получить упорядоченный список, который соответствует порядку по целям (по возрастанию).SQL Присоединиться и отсортировать

Это кажется достаточно простым, пока команда в вопросе не команда гостей:

  • в этом случае мы смотрим на цели в for.

  • Когда команда, о которой идет речь, является домашней командой, мы смотрим на цели против ".

Я написал следующий запрос:

(SELECT * FROM `matches`,`teams`,`outcomes` 
WHERE `home_team_id`=11 AND `matches`.away_team_id=`teams`.team_id 
AND `matches`.score_id=`outcomes`.outcome_id 
ORDER BY `against`,`date` DESC LIMIT 0,20) 
UNION 
(SELECT * FROM `matches`,`teams`,`outcomes` 
WHERE `away_team_id`=11 AND `matches`.home_team_id=`teams`.team_id 
AND `matches`.score_id=`outcomes`.outcome_id 
ORDER BY `for`,`date` DESC LIMIT 0,20) 

Он работает, но результирующий набор состоит из двух половин, я хочу, чтобы объединить результаты и заказ conceeded ли команда дома или в гостях. Нужен ли мне псевдоним для этого?

спасибо.

+0

Не могли бы вы разместить структуры таблицы? Я понимаю, что вы пытаетесь сделать, но без структур есть слишком много догадок - например, я не уверен, что 'for',' против' и 'date' находятся в' match' или 'results'. –

ответ

0

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

select * from 
((SELECT matches.*, teams.*, outcomes.against as goals 
FROM matches,teams,outcomes 
WHERE 
    matches.home_team_id=11 
    AND matches.away_team_id=teams.team_id 
    AND matches.score_id=outcomes.outcome_id 
) 
UNION 
(SELECT matches.*, teams.*, outcomes.for as goals 
FROM matches,teams,outcomes 
WHERE matches.away_team_id=11 
    AND matches.home_team_id=teams.team_id 
    AND matches.score_id=outcomes.outcome_id 
)) as union_table 
order by goals, date desc limit 0,20; 

Этот запрос прекрасно выполняется в базе данных MySQL.

+0

Огромное спасибо, я работал очень похоже, снова используя псевдоним. В письменном виде это помогло мне лучше понять проблему. Hopefulyl кто-то другой также найдет это полезным. –

0

, поскольку у вас уже есть две половинки, вы можете просто выбрать все, от вашего запроса и сортировать соответственно:

SELECT * FROM 
(
(SELECT * FROM `matches`,`teams`,`outcomes` 
WHERE `home_team_id`=11 AND `matches`.away_team_id=`teams`.team_id 
AND `matches`.score_id=`outcomes`.outcome_id 
ORDER BY `against`,`date` DESC LIMIT 0,20) 
UNION 
(SELECT * FROM `matches`,`teams`,`outcomes` 
WHERE `away_team_id`=11 AND `matches`.home_team_id=`teams`.team_id 
AND `matches`.score_id=`outcomes`.outcome_id 
ORDER BY `for`,`date` DESC LIMIT 0,20) 
) as results order by results.conceeded asc 
Смежные вопросы