Создание одного набора результатов из нескольких таблиц соединения; столбцы состоят из таблицы поиска

0

Кто-нибудь знает, можно ли написать запрос, который может произвести следующий вывод на основе приведенных ниже таблиц?

Мне удалось создать приведенные ниже результаты, создав три отдельных запроса и передав результат предыдущего запроса в следующий запрос. Но я надеялся на более эффективный способ.

Я хочу, чтобы этот результат использовался, используя ONE SQL?

          baseball  computer  laptop
Jane Doe  5                  
Joe Blogs           8         8

Это таблицы, с которыми мне нужно работать:

таблица лиц

id    first_name  last_name
101   Jane        Doe
576   Joe         Blogs

таблица хобби

id hobby_type   hours_spent
1  sports       5
2  technology   8

таблица hobby_types

id name
33 computer
39 baseball
45 laptop

people_hobbies join-table для человека и хобби

id person_id hobby_id
1  101      1
3  576      1
2  576      2

hobbies_hobby_types join-table для хобби и hobby_types

hobby_id hobby_type_id 
1        39
2        33
3        45
Теги:

2 ответа

2
Лучший ответ

Вы пытаетесь получить так называемую сводную таблицу .

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

1

Как говорит AndreKR, вы не можете сделать это в одном select в MySQL с неограниченным количеством столбцов, но если значения столбца известны заранее, вы можете сделать это с помощью такого запроса:

select person_name,
       sum(case hobby_type when 'baseball' then hours_spent else 0 end) baseball,
       sum(case hobby_type when 'computer' then hours_spent else 0 end) computer,
       sum(case hobby_type when 'laptop' then hours_spent else 0 end)   laptop
from
(select p.first_name + ' ' + p.last_name person_name,
        ht.name                          hobby_type,
        h.hours_spent
 from persons p
 join persons_hobbies ph on p.id = ph.person_id
 join hobbies h on ph.hobby_id = h.id
 join hobbies_hobby_types hht on h.id = hht.hobby_id
 join hobby_types ht on hht.hobby_type_id = ht.id) sq
group by person_name

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню