1

私はユーザーのリストとワクチンのリストを持っています。ユーザーが持っているワクチンを追跡したいので、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

ユーザーがエボラの予防接種を受けているが Hep A の予防接種を受けていない場合、私はエボラ行を取得します。

編集 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

2番目の問題(編集後)は、SQLに関する限り、比較にnullがあるものはすべてfalseであるためです。

次の 2 つのオプションがあります。

1) OR を使用して null の不測の事態 (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 に答える
1

簡単: ユーザーがワクチンを接種した場合にのみ、レコードをvaccine_userにINSERTします(最後の列は省略できます)。

于 2012-04-08T09:43:07.320 に答える
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;

ワクチンの場合、ユーザーが持っていないすべてのワクチンを取得するために、おそらくワクチン テーブルとの別の結合を行うことができます。

注:正確なものを書くにはテーブルなどが必要になるため、クエリは正確ではありませんが、要点はわかると思います。

于 2012-04-08T09:44:58.043 に答える