1

我有一个用户列表和一个疫苗列表,我想跟踪用户拥有哪些疫苗,所以我也有一个疫苗用户表。我想在视图中显示复选框列表、疫苗名称以及用户是否接种了该特定疫苗。

我目前正在使用 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');
4

3 回答 3

1

简单:仅当用户接种疫苗时才将记录插入到疫苗用户中(并且您可以省略最后一列)

于 2012-04-08T09:43:07.320 回答
1

如果我正确理解您的要求,这似乎是一个使用left outer join查询的简单案例。左外连接将连接与空行不匹配的行(所有值都将为空)。因此,您可以进行如下查询:

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;

您可能可以与疫苗表进行其他联接,以获取用户未接种过的所有疫苗(如果有疫苗)。

注意:查询不准确,因为我需要表格和东西来写准确的东西,但我认为你明白了。

于 2012-04-08T09:44:58.043 回答
1

您的第二个问题(在编辑之后)是因为就 SQL 而言,比较中带有 null 的任何内容都是错误的。

你有两个选择:

1)更改您的查询以使用 OR 来覆盖空意外事件(v._id IS 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-08T15:06:44.330 回答