我有一个用户列表和一个疫苗列表,我想跟踪用户拥有哪些疫苗,所以我也有一个vaccine_users表。我想在视图中显示复选框列表、疫苗名称以及用户是否接种了该特定疫苗。
我目前使用的是一个ListActivity,我知道它会回收视图,所以我需要将数据放在游标中,这给我带来了一些麻烦,因为我只想跟踪谁接种了哪些疫苗,而不是用户没有接种的所有疫苗。
所以我想要这样的东西:
userId vaccineId hasVaccine
1 2 0
1 2 1我有user,vaccine,vaccine_user表,我可以查询用户接种了哪种疫苗,但是hasVaccine=0行给我带来了麻烦,因为我没有存储用户没有接种的疫苗。
编辑:我认为左外部连接是在正确的轨道上,我尝试了:
SELECT v.name, u._id as userId, vu._id as vaccineId FROM user u LEFT OUTER JOIN vacc_user vu ON u._id = vu.userId LEFT OUTER JOIN vaccine v ON v._id = vu.vaccineId WHERE u._id = 4;我认为这应该会导致这个结果
name userId vaccineId
Ebola 4 2
Hepatit A 4 null如果用户接种了埃博拉疫苗,但没有接种甲型肝炎疫苗,但我只得到了埃博拉疫苗。
编辑2:以下是当前表单中的相关表格,为sqllite3创建,但希望也适用于MySql。
CREATE TABLE user (_id integer primary key autoincrement, name text not null default 'unnamed');
CREATE TABLE vacc_user(_id integer primary key autoincrement, userId integer not null default 0, vaccineId integer not null default 0);
CREATE TABLE vaccine (_id integer primary key autoincrement, name text default 'unnamed vacc', text text default 'no desc');发布于 2012-04-08 23:06:44
您的第二个问题(在编辑之后)是因为对于SQL而言,在比较中包含null的任何内容都是false。
您有两个选择:
1)将您的查询更改为使用OR来覆盖null偶发事件(v._id为NULL),这样您将拥有:
SELECT v.name, u._id as userId, vu._id as vaccineId FROM user u LEFT OUTER JOIN vacc_user vu ON u._id = vu.userId LEFT OUTER JOIN vaccine v ON ((v._id = vu.vaccineId) OR (v._id IS NULL)) WHERE u._id = 4;2)将未收到的疫苗接种的条目添加到您的表中,并在SQL表定义本身或通过程序代码使用默认条目(可能是“未接种疫苗”的"nv“),然后您应该通过该查询获得所需的结果。
发布于 2012-04-08 17:43:07
简单:仅当用户接种疫苗时才将记录插入到vaccine_user中(并且可以省略最后一列)
发布于 2012-04-08 17:44:58
如果我正确理解了您的需求,这似乎是一个使用left outer join查询的简单案例。Left outer join将连接与空行不匹配的行(所有值将为null)。所以你可以有一个类似这样的查询:
SELECT * FROM user u LEFT OUTER JOIN vaccine_user vu ON u.id = vu.user_id LEFT OUTER JOIN vaccine v ON v.id = vu.vaccine_id WHERE v.id=null;您可能会与疫苗表进行另一个连接,以获得用户没有接种过的所有疫苗。
注意:这个查询并不准确,因为我需要表和东西来写一些准确的东西,但是我想你已经明白了这一点。
https://stackoverflow.com/questions/10061807
复制相似问题