android sqlite ...在很多关系中得到计数

时间:2016-02-23 19:35:03

标签: android database sqlite

我正在尝试在我的Android应用中实现特定的数据结构。 sqlite中的多对多关系。

在我的应用中,AlbumImages的集合(基本上是一个命名的分组,就像一种标记),这意味着Image可以成为不同Albums的一部分因而有多对多的关系。

我的代表是:

-- Album table
_id | name
-------------
1   | Ankara
2   | Laces
3   | Scarfs
4   | Agbada

-- Image table
_id | name      | uri
-----------------------
1   |           | uri1
2   | name2     | uri2
3   |           | uri3
4   |           | uri4
5   |           | uri5
6   |           | uri6
7   |           | uri7
8   |           | uri8
9   | imagename | uri9

-- AlbumImage table
-- This table contains the relationship between albums and images
_id | album_id | image_id
-----------------------
1   | 1        | 1
2   | 2        | 2
3   | 2        | 3
4   | 2        | 4
5   | 1        | 4
6   | 3        | 4
7   | 3        | 6
8   | 1        | 9
9   | 1        | 8

我想查询相册数据并附加一个列,其中包含每个图像的数量。 所以所需的结果如下:

-- Desired result after query
_id | name   | num_photos
--------------------
1   | Ankara | 4
2   | Laces  | 3
3   | Scarfs | 2
4   | Agbada | 0

这是我当前的SQL查询 INCORRECT (请注意注释掉的部分)

SELECT
    _id,
    name,
    (SELECT
--1     Albums.name  -- When using only subquery uncomment to add albumName column
        COUNT(*)
        FROM 
            Albums,
            AlbumImages,
            Images
        WHERE
--2         Albums._id = 2 AND
            album_id = Albums._id AND
            image_id = Images._id

    ) AS image_count
FROM 
    Albums 
--3WHERE
--4 _id = 2;

这给了我类似的东西:

_id | name   | num_photos
--------------------
1   | Ankara | 9
2   | Laces  | 9
3   | Scarfs | 9
4   | Agbada | 9

查询单个项目(取消注释2,3和4)时,mainquery-subquery组合工作正常。

当使用ONLY子查询查询单个项目时(仅取消注释1和2,运行子查询),它适用于在AlbumImages表中具有关系的相册条目(id 1,2和3,如

1 | Ankara | 4

)但返回id为4的null Album.name,它没有像

这样的关系

| NULL | 0

  1. 我不确定如何用整个SQLite语句来表达我想要的结果。我正在尝试最好只使用单一查询语句,因为数据应由适配器用于填充回收者视图。

  2. 如果有更简单的方法(更简单的关系,更简单的查询),请告诉我。

1 个答案:

答案 0 :(得分:1)

Select a._id, a.name, count(album_id) from
album a left outer join AlbumImage ai on ai.album_id = a._id
Group By a._id 

你基本上做的是获取albumImage中的所有行,并根据album_id将它们与相册中的行相匹配。

以下是对联接的解释:http://blog.codinghorror.com/a-visual-explanation-of-sql-joins/

group by将所有行与该_id合并。