2009-11-17 85 views
1

我對SQLite有點新,而且我對於我的數據庫設計有一些困惑。我會解釋。假設你和你的朋友在互聯網上使用了許多不同的暱稱(可以每人多一個)。我們這裏有一個人的ID和這個人使用的所有暱稱的列表。這是一個大列表中的單個條目。這裏的目標是通過使用SQLite以SELECT語句可以用來獲取包含指定暱稱的所有條目的方式來存儲這些數據。SQLite - 在同一個數據/列的多個條目上進行SELECT

我想過創建一個有兩列的表,第一個是ID(主鍵),另一個是保存CSV格式暱稱的TEXT。然而在這個例子中,我不知道如何編寫select語句來搜索和匹配存儲在CSV中的暱稱。

想法?

+0

作爲添加上,這個問題本身就不是SQLite的之一,但數據庫心計。 SQLite和支持多個表的任何其他體面的數據庫一樣有效。這一切都從一個適當的模式開始。 – MPelletier 2009-11-17 21:31:00

回答

5

對於初學者來說,這裏是你有

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

爲什麼不只是有如下表:

人(列:爲person_id,PERSON_NAME)

暱稱(列:nickname_id,暱稱)

Person_Nickname(列:爲person_id,nickname_id)

然後您創建從Person到Person_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 
1

您需要2個表:

  • 用戶
  • 暱稱

在表「用戶」你有ID,姓名,用戶的其他可選信息。 在表「暱稱」你有user_id,暱稱。

這是一對多的協調。 即可獲得所有用戶的暱稱列表您查詢像這樣(使用用戶ID):

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

像落實少的數據庫,你可以這樣做:
只使用一個表2場(用戶,暱稱)。 然後你得到所有約翰的暱稱列表(你可以使用IDS,太)與用戶喜歡此相關的一個查詢:

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

的CSV方法的作品,但你需要實現自己的功能添加/刪除/解析暱稱,而且我解釋的兩個實現幾乎肯定會慢一些。

相關問題