2011-06-09 2 views
0

У меня есть две таблицы базы данных MySQL: один из них содержит список чемпионатов и другой заголовок записи. Схемы выглядеть следующим образом:Заказ MySQL-запроса с LEFT JOIN

championships

id INT AUTO_INCREMENT PRIMARY_KEY 
name VARCHAR(255) NOT NULL UNIQUE 
rank INT(2) NOT NULL DEFAULT '1' 

title_history

id INT AUTO_INCREMENT PRIMARY_KEY 
championship INT FOREIGN_KEY REFERENCES (championships.id) 
winner VARCHAR(255) NOT NULL 
date_won DATE NOT NULL 

Я хочу, чтобы иметь возможность вытащить последний обладатель титула. Я в настоящее время тянуть в обладатель титула со следующей MySQL LEFT JOIN запроса:

SELECT c.id, h.winner 
FROM championships c 
LEFT JOIN title_history h 
ON c.id = h.championship 
ORDER BY c.rank ASC 

Однако, это только вытягивает первый результат для каждого чемпионата по индексу по умолчанию (id я полагаю). Когда я попытался добавить ORDER BY h.date_won в качестве предложения, запрос кажется упавшим и не возвращает никаких результатов.

Я что-то не так?

+0

Что 'championships.rank' отстаиваем? –

+0

Это так, что я могу заказать чемпионаты по важности. –

+1

Я действительно не понимаю, если вы хотите сначала для каждого чемпионата, тогда у вас должна быть какая-то группировка, которая не только левая, это вопрос, который вы вставили здесь неполным? Изменение 'order by' не меняет число строк u, так что изменилось в этом запросе? –

ответ

0

Я думаю, что я взломал его! Следующий запрос, кажется, чтобы дать мне то, что мне нужно:

SELECT c.id, c.name, h.winner 
FROM championships c 
LEFT JOIN title_history h 
ON c.id = h.championship 
GROUP BY c.id 
ORDER BY c.rank ASC, h.date_from ASC 

EDIT: Я не треснувшие его. Поскольку я группирую идентификатор чемпионата, я получаю только первый победитель титула, даже если после этого победители были победителями.

EDIT 2: решаемые с помощью следующего запроса:

SELECT friendly_name, 
(SELECT winner FROM title_history WHERE championship = c.id ORDER BY date_from DESC LIMIT 1) 
FROM championships AS c 
ORDER BY name 
+0

Я не думаю, что вам нужен 'GROUP BY c.id', поскольку' id' является первичным ключом таблицы 'чемпионаты'. –

+0

if u group by c.Id ... как можно использовать другие столбцы, выглядит как insect синтаксис –

+0

@Piotr: Это правильно в MySQL :) –

0

Это покажет только последний (решили) чемпионат:

SELECT winner 
FROM title_history 
ORDER BY date_won DESC 
LIMIT 1 

Чтобы показать весь чемпионат и их победитель, ваша LEFT JOIN попытки кажется правильной. Может быть, вы хотите, чтобы упорядочить результаты по date_won:

SELECT c.id, h.winner 
FROM championships c 
    LEFT JOIN title_history h 
    ON c.id = h.championship 
ORDER BY date_won DESC 

или заказать по важности (и date_won для чемпионатов с тем же значением):

SELECT c.id, h.winner 
FROM championships c 
    LEFT JOIN title_history h 
    ON c.id = h.championship 
ORDER BY c.rank ASC 
     , h.date_won DESC 
+0

Нет, поскольку я хочу последнего победителя для каждого чемпионата; но в чемпионате могут не быть победителей, хотя я все же хочу получить результат для этого результата, следовательно, «LEFT JOIN». –

+0

Это не поймает чемпионаты без победителей (в настоящее время играет) – CristiC

+0

@Martin: Я, хотя вы сказали * «Я хочу последний обладатель титула» * –