SQLite - ВЫБОР из нескольких записей одних и тех же данных / столбца
-
20-09-2019 - |
Вопрос
Я немного новичок в Базы данных 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 работает, но вам нужно было бы реализовать свою собственную функцию для добавления / удаления / синтаксического анализа псевдонимов, и это почти наверняка было бы медленнее, чем две реализации, которые я объяснил.