添加未知的默认值

时间:2012-04-08 09:29:20

标签: android sql sqlite

我有一份用户列表和疫苗列表,我想跟踪用户使用哪种疫苗,所以我也有一个疫苗用户表。我想在视图中显示一个复选框列表,疫苗名称以及用户已接种该特定疫苗的情况。

我目前正在使用ListActivity,我已经了解了回收视图所以我需要在光标中提供数据,这给我带来了一些麻烦,因为我只想跟踪谁有哪些疫苗接种,而不是用户没有的所有疫苗。

所以我想要这样的事情:

userId     vaccineId     hasVaccine
1          2             0
1          2             1

我有表用户,疫苗,疫苗_用户,我可以查询用户使用的疫苗,但是由于我没有存储用户没有的疫苗,因此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');

3 个答案:

答案 0 :(得分:1)

简单:只有在用户接种疫苗时才将记录插入vaccine_user(您可以省略最后一栏)

答案 1 :(得分:1)

如果我理解您的要求,似乎是使用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;

您可以与疫苗表进行其他联接,以获得用户在接种疫苗时未接种过的所有疫苗。

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

答案 2 :(得分:1)

你的第二个问题(在编辑之后)就SQL而言,比较中任何带空值的东西都是假的。

您有两种选择:

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”表示“未接种”),然后你应该达到你的结果对该查询的渴望。