2012-09-23 103 views
1

我有一個person表和language表。每個人最多可以說4種語言。我的客戶想要搜索可以說話的人,例如Spanish我可以在結果表中顯示一對多結果嗎?

我的問題是,結果表格當前不會有一個名爲Language的列,因爲他們會說不止一個。我只能顯示第一個,但隱藏他們說的其他語言會導致誤導。

表可能對每種語言一列,並在NULL填寫,如果他們沒有所有4種語言,即:

Language 1 
Language 2 
Language 3 
Language 4 

但這似乎很邋遢。

我已考慮使用逗號分隔列表在單列中列出所有語言,但這對於按字母順序對列進行排序非常有用。

目前,我不得不告訴我的客戶,結果表只能顯示其中一個人(1到1)的列,即namelocation,本地語言等只有當客戶端點擊人,可以揭示他們所有的語言。

有誰知道是否有一種常見的方法來解決這個問題?希望這是有道理的

我有一個關聯表。問題是,我的搜索將返回

李四,高譚市,西班牙

然後

李四,高譚市,上下一行法國

- 但後來同樣的人在表中列出兩次。當我將每個名稱限制爲一個條目時,我只會得到「joe bloggs,gotham city,spanish」。現在我不知道他也會說法語。這更清楚嗎?

+0

你的表結構究竟是什麼,你的查詢是什麼?你是否想要一個包含所有人語言的結果集? –

+0

請檢查如何標記答案。如果你沒有很好的回答率,很多人將來都不會回答你的問題。 –

+0

謝謝你的迴應 – Alex

回答

0

已經想過這個多一些,看來你有以下選項

  1. 使用Christophe和我建議的簡單連接/鏈接/關聯表,然後按照調用SQL的程序中的數據。這是最簡單的路線。
  2. 維護逗號分隔的語言列表以及連接表。連接表將允許您回答諸如「誰會說西班牙語」之類的查詢,而列表將使您能夠打印出每個人的語言列表。維護這個列表將是一個問題。
  3. 使用Ravindra的'專用領域每種語言'方法;每次你需要一種新的語言時,你都必須改變字段結構,因此這種方法是不被推薦的。
  4. 使用交叉表查詢;這很難做到,取決於你使用哪種SQL。看看這篇文章creating-cross-tab-queries-and-pivot-tables-in-sql

在我的選擇中,選項1是最好也是最簡單的。 SQL在做什麼時非常好,在做什麼時很糟糕,因此最好採用SQL的最佳部分並用聲明性語言的最佳部分包圍它們。

+0

謝謝你。我已經選擇了選項1 - 並且在結果表中不會有一列,其中該人員可以爲該列提供多個項目。無論如何,這是多餘的 - 如果我的客戶將搜索過濾到西班牙語發音者,我們知道所有返回的結果都可以說西班牙語,所以不需要在結果表中顯示「列西班牙語」的列。至少,這就是我將解決方案「賣」給客戶的方式 – Alex

0

所以解決這個問題的傳統方法是創建一個名爲關聯表的東西,該關聯表對人員和語言表都有外鍵。這可以讓你添加任意數量的語言(包括零)。然後,您可以加入這些表格來查找所有說出特定語言的用戶。

這可能有助於如何構建數據庫:http://en.wikipedia.org/wiki/First_normal_form 有更高的正常形式,但這會幫助您解決當前的問題。

+0

嗨,謝謝你的迴應。 – Alex

+0

請參閱我添加到問題的附加評論 – Alex

+0

然後難道你不能在服務器端處理你的查詢結果嗎?沒有太多的痛苦,在數據庫層面上確實無法完成。 –

1

您應該有一個連接表,其中包含兩個字段:人員和語言。每個語言每人應該有一行,所以如果一個人說四種語言,這個用戶會有四行。

該表的主鍵將包含這兩個字段。

然後得到一個列表,它的人說西班牙語,你會需要像

select people.name 
from people inner join p2l 
on people.id = p2l.person 
inner join languages 
on p2l.language = languages.id 
where languages.name = 'Spanish' 

查詢和誰講的語言

select people.name, languages.name 
from people inner join p2l 
on people.id = p2l.person 
inner join languages 
on p2l.language = languages.id 

而現在的列表中的所有用戶的列表所有的人,無論他們說一種語言或不

select people.name, languages.name 
from people left join p2l 
on people.id = p2l.person 
inner join languages 
on p2l.language = languages.id 
+0

嗨。我確實有這個。查看我添加到原始問題中的額外文本。如果在搜索標準中定義了NO語言,則會出現問題 - 它將返回所有語言,並最終在結果表中爲該人輸入4個條目。對不起,如果我不清楚 – Alex

+0

如果一個人不說話,那麼在p2l表中將不會有行。在這種情況下,您需要「左連接」而不是「內連接」 –

0

創建兩個表
有人cloumns- person_id,person_name & more如果你想。
創建另一個表-language已經columns- person_id,lang1,lang2,lang3,lang4
使person_id as foreign key
現在當u要訪問的語言,只是compairing獲取它們PERSON_ID

SELECT p.person_id 
FROM person p, language l 
WHERE p.person_id = l.person_id; 
+0

當需要添加新語言時會發生什麼?這是一個非常不靈活的解決方案,應該不惜一切代價避免。這違反了第一種正常形式 - 沒有重複的組。 –

+0

@ No'amNewman:它在哪裏重生 –

+0

@Ravindra bagaleji:tumach uttar barobar aahe .. – Freelancer