SQLite - SELEZIONA su più voci degli stessi dati / colonna
-
20-09-2019 - |
Domanda
Sono un po 'nuova per SQLite , e sto avendo un leggero dilemma circa la mia progettazione di database. Spiegherò. Supponiamo che voi ed i vostri amici utilizzare un certo numero di diversi soprannomi su Internet (può essere più di una per persona). Quello che abbiamo qui è un ID della persona e un elenco di tutti i nick che questa persona usa. Si tratta di una singola voce in un elenco di grandi dimensioni. L'obiettivo è quello di memorizzare questi dati utilizzando SQLite in modo SELECT può essere usato per andare a prendere tutte le voci che contengono il soprannome specificato.
ho pensato di creare una tabella con due colonne, essendo il primo (chiave primaria) ID e l'altro è un testo che contiene nomi in un formato CSV . Tuttavia, in questo esempio non so come scrivere l'istruzione select per la ricerca e la partita soprannomi memorizzati in formato CSV.
idee?
Soluzione
Per cominciare, qui è quello che hai
SELECT Name, Nickname FROM MyTable WHERE Nickname = 'Copper';
Ma io consiglierei vivamente di avere un tavolo per i nomi, e un tavolo per i nick utilizzato, in modo tale che il soprannome ha un riferimento a nomi.
CREATE TABLE Users (
UserId INTEGER PRIMARY KEY,
Name TEXT
);
CREATE TABLE Nicknames (
NickNameId INTEGER PRIMARY KEY,
UserId INTEGER REFERENCES Users(UserId),
NickName Text
);
Troverete questo schema vi darà un maggiore controllo per modificare le voci, rimuoverli, ecc.
query che sia con un INNER JOIN
:
SELECT Users.Name, NickNames.NickName
FROM Users INNER JOIN NickNames ON User.UserId=NickNames.UserId
WHERE NickNames.NickName = 'Copper';
o una query nidificate:
SELECT Users.Name
FROM Users
WHERE User.UserId IN (
SELECT NickNames.UserId
FROM NickNames
WHERE NickNames.NickName = 'Copper');
I due sono equivalenti (in questo caso) per specificare il join con una clausola WHERE
. E ' lavori , ma è scarsa forma (non è chiaro come INNER JOIN
):
SELECT Users.Name, NickNames.NickName
FROM Users, NickNames
WHERE User.UserId = NickNames.UserId
AND NickNames.NickName = 'Copper';
Altri suggerimenti
Perché non basta avere le seguenti tabelle:
persona (colonne: person_id, PERSON_NAME)
Nickname (colonne: nickname_id, soprannome)
Person_Nickname (colonne: person_id, nickname_id)
Quindi si crea chiavi esterne da persona a Person_Nickname e dal nickname Person_Nickname. Questo permette una data persona di avere il maggior numero di soprannomi che vuoi.
Poi, per trovare tutte le persone che corrispondono a un dato soprannome, è possibile scrivere:
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
È necessario 2 tabelle:
- utenti
- soprannomi
Nella tabella "utenti" si dispone di id, nome, altre informazioni facoltative sull'utente. Nella tabella "soprannomi" che hai user_id soprannome.
E 'un uno a molti assosiation. Quindi per ottenere un elenco di tutti i nickname degli utenti si esegue una query in questo modo (utilizzando l'ID utente):
SELECT nicknames.nickname FROM nicknames WHERE nicknames.user_id=id
Come un database meno come implementazione si potrebbe fare questo:
utilizzare soltanto una tabella con 2 campi (utente, nickname).
Quindi si ottiene una lista di tutti i soprannomi di John (è possibile utilizzare gli ID, anche) associato ad un utente con una query come questa:
SELECT table.nickname FROM table WHERE table.user="john"
Le opere approccio CSV, ma si avrebbe bisogno di implementare la propria funzione per aggiungere / rimuovere / analizzare soprannomi, e sarebbe quasi certamente più lento che le due implementazioni ho spiegato.