Сложный SQL-запрос в MySQL

0

У меня есть следующие таблицы в базе данных:

bands
- band_id
- band_name

albums  
- album_id 
- album_name  
- album_owner  

songs
- song_id
- song_name
- song_owner

ratings
- rating_id
- rating_value
- rating_song

Таблицы albums и songs относятся к band_id из таблицы bands на album_owner и song_owner.

Таблица ratings относится к song_id из таблицы songs на rating_song.

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

  • 0
    Можете ли вы привести пример того, как бы вы хотели, чтобы результат выглядел?
  • 2
    Во-первых, я предлагаю лучшие соглашения об именах для ваших таблиц. Вместо album_owner / song_owner, назовите его band_id. Вместо rating_song, назовите это song_id. Это сделано для того, чтобы человек мог мгновенно узнать отношения между столами.
Показать ещё 1 комментарий
Теги:

2 ответа

3

попробуйте это

Select Band_Id, Band_Name,
  (Select Count(*) From Albums 
   Where Album_Owner = B.Band_Id) AlbumCount,
  S.Song_Id, S.Song_Name,
  Avg(rating_value) Rating
From Bands B 
  Left Join Songs S 
      On S.Song_Owner = B.Band_Id
  Left Join Ratings R 
      On R.rating_song = S.Song_Id
Group By Band_Id, Band_Name, S.Song_Id, S.Song_Name
  • 0
    Я не получаю никакого результата, и он на самом деле вылетает на сервер даже с лимитом 0,10.
  • 0
    вылетает сервер ??
0

Чтобы сделать все это в одном запросе, вам нужно использовать подзапросы.

select band_name,
(select count(*)
from album
where album_owner=band_id) as album_count,
(select count(*)
from song
where song_owner=band_id) as song_count,
(select avg(rating_value)
from song
join rating on rating_song=song_id
where song_owner=band_id) as average_rating
from band

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

  • 0
    Да, средний рейтинг для всех песен.
  • 0
    Вылетает сервер даже с лимитом 0,10.

Ещё вопросы

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