如何通过多个表获得平均值

时间:2019-04-01 20:34:12

标签: sql sqlite

我做了作业,在下面的表格中获得了相册(user_id = x)中用户的平均标签:

>>> CREATE TABLE USERS (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
                        NAME TEXT NOT NULL);

>>> CREATE TABLE ALBUMS (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
                         NAME TEXT NOT NULL, CREATION_DATE TEXT NOT NULL, 
                         USER_ID INTEGER REFERENCES USERS(USER_ID) NOT NULL);

>>> CREATE TABLE PICTURES (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
                           NAME TEXT NOT NULL,
                           LOCATION TEXT NOT NULL,
                           CREATION_DATE TEXT NOT NULL, 
                           ALBUM_ID INTEGER REFERENCES ALBUMS(ALBUM_ID) NOT NULL);

>>> CREATE TABLE TAGS (ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
                       PICTURE_ID INTEGER REFERENCES PICTURES(PICTURE_ID) NOT NULL,
                       USER_ID INTEGER REFERENCES USERS(USER_ID) NOT NULL);";

说明: 每个标签在TAGS中是一行,并且有picture_id,每张图片都有album_id,每张专辑都有user_id,基本上我需要计算用户被标记了多少次在每个相册中,找到用户在相册中被标记的平均次数。

我只能使用SELECT ? FROM, AVG(), COUNT(), JOIN (INNER, LEFT, RIGHT, FULL JOIN), ON, IN, AND, OR, LIKE, , NOT, (=, != , >, <), IS, DISTINCT, ORDER BY(ASC/DESC), LIMT, OFFSET, and WHERE来使用它,这意味着我不能使用GROUP BY

我尝试过

SELECT * FROM TAGS INNER JOIN PICTURES ON tags.picture_id = PICTURES.Id where album_id IN (select id from ALBUMS where user_id = x) AND user_id = x;

但是它只给我一个包含用户所有标签的表

如何获取(user_id = x)的每张专辑的avg标签,这有可能吗?

1 个答案:

答案 0 :(得分:1)

首先计算用户在每个相册中被标记的次数,然后获得这些计数器的平均值:

select 
  avg(counter) averagetags
from (
  select count(t.user_id) counter
  from albums a 
  inner join pictures p on p.album_id = a.id
  inner join tags t on t.picture_id = p.id
  where t.user_id = ?
  group by a.id
)