2012-04-08 3 views
1

У меня есть список пользователей и список вакцин, я бы хотел отслеживать, какие вакцины у пользователя есть, поэтому у меня также есть таблица vaccine_users. Я хочу отобразить список флажков в представлении, имя вакцины и, чтобы пользователь был вакцинирован этой конкретной вакциной.Добавить значение по умолчанию неизвестно

В настоящее время я использую ListActivity, который, как я понял, перерабатывает представления, поэтому мне нужно иметь данные в курсоре, что дает мне немного неприятностей, так как я хотел бы только отслеживать, кто имеет вакцинации, не все вакцины, которых у пользователя нет.

Так что я хотел бы что-то вроде этого:

userId  vaccineId  hasVaccine 
1   2    0 
1   2    1 

У меня есть таблицы пользователя, вакцины, vaccine_user и я могу запросить, для которых вакцина имеет пользователь, но это hasVaccine = 0, что дает ряд Мне неприятно, потому что я не хранил, какую вакцину у пользователя нет.

EDIT: Я думаю, что левое внешнее соединение находится на правильном пути, я попытался это:

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 

если пользователь вакцинированы против Эбола, но не Хеп А, но я просто получаю Эболу.

EDIT 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

Ваша вторая проблема (после редактирования) объясняется тем, что касается SQL, все, что имеет значение null в сравнении, является ложным.

У вас есть два варианта:

1) Измените запрос, чтобы использовать или для покрытия нулевых непредвиденного (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

+0

затем петляйте пользователей и внутри цикла - зацикливайте вакцины: если есть запись - пользователь взял ее, иначе он/она ее не принимал. – alfasin

+0

проблема в том, что все данные должны быть в результате запроса – dutt

1

Если я правильно понимаю ваши требования должным образом, это кажется простым случаем использования a 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

+0

Если вам нужна дополнительная помощь, нам нужны DDL для таблиц, чтобы мы могли их воспроизвести и протестировать запросы ... предпочтительнее для MySQL. Если вы можете интегрировать hibernate в приложение, запрос будет очень просто в HQL. – Ali

+0

WHERE v.id = null не будет работать. Любой SQL со сравнением с null вернет неизвестный. – Barak

Смежные вопросы