我有一份用户列表和疫苗列表,我想跟踪用户使用哪种疫苗,所以我也有一个疫苗用户表。我想在视图中显示一个复选框列表,疫苗名称以及用户已接种该特定疫苗的情况。
我目前正在使用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');
答案 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”表示“未接种”),然后你应该达到你的结果对该查询的渴望。