2012-04-08 92 views
1

我有一個用戶列表和疫苗的名單,我想跟蹤哪些疫苗用戶,所以我有一個vaccine_users表也是如此。我想在視圖中顯示覆選框列表,疫苗名稱以及用戶是否接種過特定疫苗。添加默認值未知

我目前使用的ListActivity,我明白回收視圖,所以我需要在遊標中的數據,這給了我一些麻煩,因爲我只想跟蹤誰有哪些接種,而不是用戶沒有的所有疫苗。

所以我想是這樣的:

userId  vaccineId  hasVaccine 
1   2    0 
1   2    1 

我有表的用戶,疫苗,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'); 

回答

1

你的第二個問題(編輯後)becasue至於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)添加條目你的表沒有收到那些接種疫苗和使用默認項(也許「NV」爲「不接種疫苗」)無論是在SQL表定義本身或者雖然程序代碼,那麼你應該實現你與查詢想要的結果。

1

簡單:你插入一條記錄到vaccine_user只有當用戶拿着疫苗(你可以省略最後一列)

+0

但我想列出所有的疫苗無論用戶是否已接種與否。 – dutt 2012-04-08 09:45:38

+0

然後循環用戶和循環內 - 循環疫苗:如果有記錄 - 用戶接受了它,否則,他/她沒有接受。 – alfasin 2012-04-08 09:47:51

+0

問題是所有的數據都需要在查詢結果中 – dutt 2012-04-08 12:02:11

1

如果我正確地理解您的需求,好像使用的簡單情況一個left outer join查詢。 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; 

你也許可以做出其他的加盟與疫苗表讓所有的疫苗,如果疫苗用戶沒有了。

注:因爲我查詢不準確,我需要有表和東西寫的東西是準確的,但我想你明白了吧。

+0

我認爲你在正確的軌道上,添加了一些關於我的嘗試的更多信息。 – dutt 2012-04-08 12:17:19

+0

如果您需要更多幫助,我們需要DDL的表格,以便我們可以重新制作它們並測試查詢......最好是針對MySQL。如果您可以將hibernate集成到應用程序中,那麼在HQL中查詢將非常簡單。 – Ali 2012-04-08 14:57:14

+0

WHERE v.id = null將不起作用。任何與null比較的SQL都將返回未知。 – Barak 2012-04-08 20:59:36