SQLite - ВЫБИРАЙТЕ несколько записей одного столбца / данных - PullRequest
1 голос
/ 17 ноября 2009

Я немного новичок в SQLite , и у меня возникла небольшая дилемма в отношении дизайна моей базы данных. Я объясню. Предположим, что вы и ваши друзья используют несколько разных псевдонимов в Интернете (может быть более одного на человека). Здесь у нас есть идентификатор человека и список всех псевдонимов, которые этот человек использует. Это одна запись в большом списке. Цель здесь - сохранить эти данные с помощью SQLite таким образом, чтобы оператор SELECT мог использовать для извлечения всех записей, которые содержат указанный псевдоним.

Я думал о создании таблицы с двумя столбцами, в первую очередь это идентификатор (первичный ключ), а другой - текст, содержащий псевдонимы в формате CSV . Однако в этом примере я не знаю, как написать оператор select для поиска и сопоставления псевдонимов, хранящихся в CSV.

Идеи

Ответы [ 3 ]

5 голосов
/ 17 ноября 2009

Для начала вот что у вас есть

SELECT Name, Nickname FROM MyTable WHERE Nickname = 'Copper';

Но я бы настоятельно рекомендовал иметь таблицу имен и таблицу используемых псевдонимов, чтобы в псевдониме была ссылка на имена.

CREATE TABLE Users (
    UserId INTEGER PRIMARY KEY, 
    Name TEXT
    );
CREATE TABLE Nicknames (
    NickNameId INTEGER PRIMARY KEY, 
    UserId INTEGER REFERENCES Users(UserId), 
    NickName Text
    );

Эта схема даст вам больше возможностей для редактирования записей, их удаления и т. Д.

Запросите его с помощью INNER JOIN:

SELECT Users.Name, NickNames.NickName 
    FROM Users INNER JOIN NickNames ON User.UserId=NickNames.UserId
    WHERE NickNames.NickName = 'Copper';

Или вложенный запрос:

SELECT Users.Name
    FROM Users
    WHERE User.UserId IN (
    SELECT NickNames.UserId 
        FROM NickNames 
        WHERE NickNames.NickName = 'Copper');

Они эквивалентны (в данном случае) указанию соединения с предложением WHERE. Это работает , но это плохая форма (это не так ясно, как INNER JOIN):

SELECT Users.Name, NickNames.NickName 
    FROM Users, NickNames 
    WHERE User.UserId = NickNames.UserId
    AND NickNames.NickName = 'Copper';
1 голос
/ 17 ноября 2009

Вам нужно 2 таблицы:

  • Пользователи
  • прозвища

В таблице «пользователи» у вас есть идентификатор, имя, другая необязательная информация о пользователе. В таблице "псевдонимы" у вас есть user_id, псевдоним.

Это объединение один ко многим. Затем, чтобы получить список всех псевдонимов пользователей, вы запрашиваете его следующим образом (используя идентификатор пользователя):

SELECT nicknames.nickname FROM nicknames WHERE nicknames.user_id=id

Как реализация с меньшим количеством баз данных, вы можете сделать это:
используйте только одну таблицу с 2 полями (пользователь, псевдоним). Затем вы получите список всех псевдонимов Джона (вы также можете использовать идентификаторы), связанных с пользователем с помощью запроса, подобного следующему:

SELECT table.nickname FROM table WHERE table.user="john"

Подход CSV работает, но вам нужно будет реализовать собственную функцию для добавления / удаления / анализа псевдонимов, и почти наверняка будет медленнее, чем две реализации, которые я объяснил.

1 голос
/ 17 ноября 2009

Почему бы просто не иметь следующие таблицы:

Person (столбцы: person_id, person_name)

Псевдоним (столбцы: псевдоним_id, псевдоним)

Person_Nickname (столбцы: person_id, nickname_id)

Затем вы создаете внешние ключи от Person к Person_Nickname и от Nickname к Person_Nickname.Это позволяет данному человеку иметь столько псевдонимов, сколько вам нужно.

Затем, чтобы найти всех людей, которые соответствуют данному псевдониму, вы можете написать:

SELECT p.person_name
  FROM person.p
     , nickname n
     , person_nickname pn
 WHERE n.nickname = 'nickname of interest'
   AND p.person_id = pn.person_id 
   AND n.nickname_id = pn.nickname_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...