2013-02-22 2 views
0

Я пытаюсь присоединиться к 3 таблицам ... месяцев, months_results и issue_results. В месяц имеется ровно один месяц за месяц, но от 0 до n issue_results в месяц. Я могу настроить Left Join, чтобы получить Month_results, когда no Issue_results. Моя проблема заключается в том, что у меня есть несколько issue_results в месяц. я хочу, чтобы в моем результирующем наборе появлялось только одно появление month_results ... иначе мы удвоим результаты подсчета ежемесячных итогов.Как присоединиться к отношениям один ко многим

Например, вот таблицы

месяцев 1,2,3

Месячные Результаты (месяц, копии)
(1, 5000)
(2, 2500)
(3, 1000)

Результаты Issue (выпуск, месяц, заказы)
(1,1,750)
(2,1,500)
(3,3,250)

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

(за месяц, выпуск, количество копий, заказы)
1, 1, 5000, 750
1, 2,, 500
2,, 2500,
3, 3, 1000, 250

Использование левой Внешние соединения я могу получить второй месяц (без вопроса, чтобы правильно заполнить), но, к сожалению, я получаю следующие повторяющиеся ежемесячные результаты за второй месяц 1 ...

1, 1, 5000, 750
1, 2, , 500
2, 2500,
3, 3, 1000, 250

Любые и все предложения больш оценены.

+3

Пожалуйста, отправьте код SQL, который вы пробовали – Melanie

+1

Добро пожаловать в Stack Overflow! Какие СУБД вы используете? – Taryn

+0

Что касается дубликата 'IssueResult': откуда вы знаете, что первый результат - тот, который вы хотите? Другими словами, каково правило для определения дубликата? –

ответ

0

В зависимости от вашей СУБД есть разные способы достижения этого.

Вот решение MySQL:

SELECT M.Month, 
    I.Issue, 
    @copies:=IF(@prevMonth=M.Month,NULL,M.Copies) copies, 
    I.Orders, 
    @prevMonth:=M.Month 
FROM MonthResults M 
    LEFT JOIN IssueResults I ON M.Month = I.Month 
    JOIN (SELECT @copies:=0) t; 

Sample Fiddle Demo

Вот более общий подход, который должен работать с большинством РСУБД:

SELECT M.Month, 
    I.Issue, 
    T.Copies, 
    I.Orders 
FROM MonthResults M 
    LEFT JOIN IssueResults I ON M.Month = I.Month 
    LEFT JOIN (
     SELECT Min(I.Issue) minIssue, 
     M.Month, M.Copies 
     FROM MonthResults M LEFT JOIN IssueResults I ON M.Month=I.Month 
     GROUP BY M.Month, M.Copies 
) t ON M.Month = t.Month AND (I.Issue = t.minIssue OR I.Issue IS NULL) 

And another Fiddle demo

1

Существует не достаточно информации в giv ru, чтобы определить, какая проблема в месяц 1 связана с 5000 экземплярами. Результат, который вы ищете, показывает 5000 экземпляров, связанных с проблемой 1, а не выпуск 2, но в таблицах нет информации, которая делает это различие.Для уточнения:

Строки вашей таблицы с информацией о месяце 1 следующим образом:

Monthly Результаты:

(Month, Copies) 
    (1,5000) 

Результаты Issue:

(Issue, Month, Orders) 
    (1,1,750) 
    (2,1,500) 

Глядя на этот путь , вы можете видеть из таблицы Monthly Results, что единственной информацией, связанной с 5000 экземплярами, является месяц 1. Поэтому, когда вы присоединяетесь к результатам эмиссии, оба выпуска в месяц 1 соответствуют 5000 экземплярам.

Чтобы получить результат, который вы ищете, либо:

1) Ваша первая таблица должна будет включать вопрос (за месяц, выпуск, копии)
2) Или вам нужно указать, как вы выбираете, какой вопрос «получает» копии (в случае, если есть 1 вопрос в месяц). sgeddes предложило хорошее решение, где первый выпуск месяца - проблема, которая получает копии.

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