SQLite - ВЫБОР из нескольких записей одних и тех же данных / столбца

StackOverflow https://stackoverflow.com/questions/1751458

Вопрос

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

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

Идеи?

Это было полезно?

Решение

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

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 оговорка.IT работает, но это плохая форма (это не так ясно , как INNER JOIN):

SELECT Users.Name, NickNames.NickName 
    FROM Users, NickNames 
    WHERE User.UserId = NickNames.UserId
    AND NickNames.NickName = 'Copper';

Другие советы

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

Человек (столбцы:person_id, имя_человека)

Никнейм (столбцы:nickname_id, псевдоним)

Person_Nickname (столбцы:person_id, ник_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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top