2014-01-16 4 views
0

Мне нужно объединить две таблицы и добавить столбцы, где соответствуют определенные данные. Эти две таблицы настроены так:Объединить таблицы и добавить столбцы

Apple   | Flavor 
Fuji   | 1 
Red Delicious | 2 

Flavor | Quality 
1  | Sour 
1  | Sweet 
2  | Bitter 
2  | Sweet 

И мне нужно, чтобы добавить столбец для каждого сопоставления качества аромата, как так:

Apple   | Quality 1 | Quality 2 
Fuji   | sour  | sweet 
Red Delicious | bitter | sweet 

Примечание Также нужно добавить авто-целое число в заголовке каждого столбца прилагается.

Это похоже на высокую задачу, и я не уверен, с чего начать? Возможно ли это? Спасибо за помощь заранее.

+0

Мы не собираемся писать код для вас, по крайней мере, показать некоторые усилия. Попробуйте что-нибудь. –

+1

Довольно точно, что это невозможно с SQL. Ни в коем случае не в здравом уме. Просто запустите один запрос, чтобы получить яблоки, а второй - для получения его качеств. – mpen

+0

@ GertB. В общем, я согласен с вашими настроениями, но я не думаю, что он мог бы написать здесь. – mpen

ответ

1

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

1

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

Обычно вы бы один оператор, как

SELECT * FROM apples a JOIN flavors f ON a.flavor = f.flavor; 

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

select 
Apple, 
max(case when my_quality_numbering = 1 then Quality else null end) as Quality1, 
max(case when my_quality_numbering = 2 then Quality else null end) as Quality2 
from (
select 
a.Apple, 
f.Quality, 
case when (if(@prev_apple != a.Apple, @quality_no := 1, @quality_no := @quality_no + 1)) is null then null 
    when (@prev_apple := a.Apple) is null then null 
else @quality_no end as my_quality_numbering   
from 
apples a 
join flavors f on a.Flavor = f.Flavor 
, (select @quality_no := 0, @prev_apple := NULL) v 
order by a.Apple 
) sq 
group by Apple 
  • увидеть его работы вживую в sqlfiddle

И это только половина работы. Чтобы иметь переменное количество столбцов, вам нужно написать хранимую процедуру, которая читает из внутреннего запроса, сколько столбцов необходимо. Затем вам нужно будет построить строку запроса для внешнего запроса и выполнить все это с помощью подготовленного оператора. Довольно много работы для простого запроса. Опять же, я делал выше запрос только для удовольствия, но в целом это действительно не стоит проблем.

+0

благодарим вас за просветительскую демонстрацию. – psorensen

1

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

SELECT a.Apple, GROUP_CONCAT(f.Quality) AS Qualities 
FROM apples a JOIN flavors f ON a.flavor = f.flavor 
GROUP BY a.Apple; 

Это не то, что вы просили, поскольку оно не разделяет значения качества в отдельных столбцах. Но это довольно простой запрос, и вы можете explode() строку качеств после того, как вы вернете ее в свое приложение.

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