我正在尝试在我的Android应用中实现特定的数据结构。 sqlite中的多对多关系。
在我的应用中,Album
是Images
的集合(基本上是一个命名的分组,就像一种标记),这意味着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
我不确定如何用整个SQLite语句来表达我想要的结果。我正在尝试最好只使用单一查询语句,因为数据应由适配器用于填充回收者视图。
如果有更简单的方法(更简单的关系,更简单的查询),请告诉我。
答案 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合并。