SQLite - SÉLECTIONNEZ sur les entrées multiples des mêmes données/colonne
-
20-09-2019 - |
Question
Je suis un peu nouveau pour SQLite, et je suis d'avoir un léger dilemme à propos de ma conception de base de données.Je vais vous expliquer.Supposons que vous et vos amis utilisez un certain nombre de différents pseudonymes sur Internet (peut-être plus d'un par personne).Ce que nous avons ici est un ID de la personne et une liste de tous les surnoms que cette personne utilise.C'est une entrée unique dans une grande liste.Le but ici est de stocker ces données en utilisant SQLite dans un moyen de l'instruction SELECT peut être utilisé pour récupérer toutes les entrées qui contiennent le surnom spécifié.
J'ai pensé à la création d'un tableau avec deux colonnes, la première étant l'IDENTIFIANT (clé primaire) et l'autre étant un TEXTE qui contient des surnoms dans un CSV format.Cependant, dans cet exemple, je ne sais pas comment écrire l'instruction select pour la recherche et le match des surnoms stockées dans un fichier CSV.
Des idées?
La solution
Pour commencer, voici ce que vous avez
SELECT Name, Nickname FROM MyTable WHERE Nickname = 'Copper';
Mais je suggère fortement d'avoir une table pour les Noms, et une table pour les Pseudos utilisés, tels que le Surnom a une référence à des Noms.
CREATE TABLE Users (
UserId INTEGER PRIMARY KEY,
Name TEXT
);
CREATE TABLE Nicknames (
NickNameId INTEGER PRIMARY KEY,
UserId INTEGER REFERENCES Users(UserId),
NickName Text
);
Vous trouverez ce schéma permettra de vous donner plus de contrôle de modifier les entrées, les supprimer, etc.
Requête soit avec un INNER JOIN
:
SELECT Users.Name, NickNames.NickName
FROM Users INNER JOIN NickNames ON User.UserId=NickNames.UserId
WHERE NickNames.NickName = 'Copper';
Ou d'une requête imbriquée:
SELECT Users.Name
FROM Users
WHERE User.UserId IN (
SELECT NickNames.UserId
FROM NickNames
WHERE NickNames.NickName = 'Copper');
Les deux sont équivalentes (dans ce cas) pour la spécification de la jointure avec un WHERE
la clause.Il fonctionne, mais c'est une mauvaise forme (ce n'est pas aussi clair que INNER JOIN
):
SELECT Users.Name, NickNames.NickName
FROM Users, NickNames
WHERE User.UserId = NickNames.UserId
AND NickNames.NickName = 'Copper';
Autres conseils
Pourquoi ne pas simplement avoir les tableaux suivants:
Personne (colonnes:person_id, person_name)
Surnom (colonnes:nickname_id, surnom)
Person_Nickname (colonnes:person_id, nickname_id)
Ensuite, vous créez des clés étrangères de la Personne à la Person_Nickname et à partir du Surnom de Person_Nickname.Cela permet à une personne d'avoir autant de surnoms que vous le souhaitez.
Alors, pour trouver toutes les personnes qui correspondent à un surnom donné, vous pouvez écrire:
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
Vous avez besoin de 2 tables:
- les utilisateurs
- surnoms
Dans la table "utilisateurs" vous avez l'id, le nom, l'autre facultatif des informations sur l'utilisateur.Dans le tableau "surnoms" vous avez user_id, surnom.
C'est l'une de beaucoup de assosiation.Ensuite, pour obtenir une liste de tous les utilisateurs des surnoms à vous de requête comme ceci (à l'aide de l'id d'utilisateur):
SELECT nicknames.nickname FROM nicknames WHERE nicknames.user_id=id
En tant que moins de la base de données, comme la mise en œuvre, vous pourriez faire ceci:
utiliser une seule table avec 2 champs (utilisateur, pseudo).Ensuite, vous obtenez une liste de tous les jean surnoms (vous pouvez utiliser des id, trop) associé à un utilisateur avec une requête comme ceci:
SELECT table.nickname FROM table WHERE table.user="john"
Le CSV approche fonctionne, mais vous devez mettre en place votre propre fonction pour ajouter/supprimer/analyser des surnoms, et il serait presque certainement être plus lent que les deux implémentations je l'ai expliqué.