Запрос MySQL, основанный на 2 таблицах, а также соединительной таблице и строках, должен включать все экземпляры по порядку объединяемых данных. - PullRequest
1 голос
/ 31 декабря 2011

Мне нужно создать результат таблицы (и выяснить, возможно ли это в рамках ограничений MySQL), который будет содержать данные из 2 таблиц, но сам запрос будет основан на 3 таблицах (включая объединяющую таблицу).И объединенные результаты должны быть добавлены к выходным результатам.

Структуры таблицы:

registrants
id, first name, last name, industryID

industries
id, name

registrants_industries (join table)
id, registrant_id, industry_id

Таким образом, в итоговой таблице выходных результатов любой владелец домена может иметь 0, 1или во многих отраслях, и названия этих отраслей должны быть добавлены в конец таблицы окончательных результатов.

registrants.id, 
registrants.first_name, 
registrants.last_name, 
industry.name-1,      
industry.name-2,  
industry.name-3,  
industry.name-4,  
industry.name-5.

Но все столбцы должны быть сопоставлены по отраслям.Например, если бы было 5 отраслей, выход был бы таким:

( Отрасли в следующем порядке: Живопись, Черепица, Общестроительные работы, Уход за двором, Кровля)

354, Mike, Smith, Painting,’’,’’,Yard Care,’’
599, Joe, Jones, ‘’,’’,’General Construction’,’’,’’

Таким образом, все отраслевые столбцы будут выровнены и могут быть отсортированы в Excel и т. Д.

Возможен ли вывод этого запроса с (My) SQL? И если да, то вы делаетеЛюбое хорошее предложение о наилучшем подходе к этому?

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

Ответы [ 3 ]

2 голосов
/ 31 декабря 2011

Вы можете использовать group_concat и получить все отрасли в одном столбце.Я знаю, что это не точный ответ на ваши вопросы, но это близко, и я не верю, что то, что вы спрашиваете, возможно только с 3 объединениями.

SELECT
R.id, 
R.first_name, 
R.last_name, 
GROUP_CONCAT(I.name) AS industries
FROM registrants R
JOIN registrants_industries RI ON R.id = RI.registrant_id
JOIN industires I ON RI.industry_id = I.id
GROUP BY R.id

Это даст

354, Mike, Smith, "Painting,Yard Care"
599, Joe, Jones, "’General Construction’"
2 голосов
/ 31 декабря 2011

Вы можете назначить номер каждой записи registrants_industries, используя подзапрос:

select  r.id, 
,       r.first_name
,       r.last_name
,       min(case when ri.RowNr = 1 then i.name end) as [Industry-1]
,       min(case when ri.RowNr = 2 then i.name end) as [Industry-2]
,       min(case when ri.RowNr = 3 then i.name end) as [Industry-3]
,       min(case when ri.RowNr = 4 then i.name end) as [Industry-4]
,       min(case when ri.RowNr = 5 then i.name end) as [Industry-5]
from    registrants r
join    (
        select  (
                select  count(*)
                from    registrants_industries ri3
                where   ri3.registrant = r2.registrant
                        and ri3.id <= ri2.id
                ) as RowNr
        ,       *
        from    registrants_industries ri2
        ) ri
on      ri.registrant_id = r.id
join    industries i
on      i.id = ri.industry_id
group by
        r.id
,       r.first_name
,       r.last_name
1 голос
/ 31 декабря 2011

Вы просите сводить значения в соответствующие столбцы.Это распространенное требование, особенно для составления отчетов и экспорта в электронные таблицы.

В SQL необходимо объявить столбцы в запросе, и они исправлены во время подготовки запроса, прежде чем ваш запрос получит возможность взглянуть на него.данные.У вас не может быть запроса, чтобы автоматически добавлять столбцы к его результирующему набору динамически, основываясь на найденных значениях данных.

Обходной путь - жесткий код выражений для каждого отдельного значения, которое вы будетевключите в результат запроса:

SELECT r.id, r.first_name, r.last_name,
  MAX(CASE i.name WHEN 'Painting' THEN i.name END) AS `Painting`,
  MAX(CASE i.name WHEN 'Tiling' THEN i.name END) AS `Tiling`,
  MAX(CASE i.name WHEN 'General Construction' THEN i.name END) AS `General Construction`,
  MAX(CASE i.name WHEN 'Yard Care' THEN i.name END) AS `Yard Care`,
  MAX(CASE i.name WHEN 'Roofing' THEN i.name END) AS `Roofing`
FROM registrants r
LEFT OUTER JOIN (
  registrants_industries ri
  INNER JOIN industries i ON i.id = ri.industry_id
) ON r.id = ri.registrant_id
GROUP BY r.id;

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

SELECT DISTINCT name FROM industries;

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

Альтернатива состоит в том, чтобы не поворачивать с помощью SQL,но вместо этого извлекайте необработанные данные обратно в ваше приложение и извлекайте несколько строк для каждого идентификатора пользователя, сортируя результаты в структуру данных приложения до тех пор, пока у вас не появится какое-то сеточное представление, похожее на требуемый сводный набор данных.

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

...