2011-10-23 58 views
0

我會盡力解釋這個問題。數據庫佈局問題

我有這樣的結構:

offers 
-------------- 
id_offer|offer|company 
1 | web programmer| Microsoft 
2 | web programmer| Microsoft 


tags 
-------------- 
id_tags | tags 
1  | php 
2  | js 
3  | asp 


offers_has_tags 
--------------- 
offers_id_offer (fk) | tags_id_tags (fk) 
    1     | 1 
    1     | 2 
    1     | 3 
    2     | 1 
    2     | 2   

如果我使用像Stackoverflow,其中問題的每個標題都是獨一無二的系統,沒有與下面的代碼沒有問題。但如果我可以有相同的標題,並擁有相同的所有者,我不能做WHERE offers = ?

所以,我需要一種不同的方法來選擇一個特定的工作。不能是標題,也不能是所有者+標題,因爲同一個所有者可以擁有相同標題的各種優惠。

INSERT INTO `offers_has_tags` (
    offers_id_offer, 
    tags_id_tags 
) 
    VALUES (
    (SELECT id_offer FROM offers WHERE offer = ?), //here 
    (SELECT id_tags FROM tags WHERE tags = ?)) 

我該如何選擇一個報價,當存在多個,相同的標題和相同的所有者?

+0

你想在這裏做什麼? – Jon

+1

在這裏?我正在幫助.. – Daniel

+0

沒有什麼可以阻止StackOverflow問題與另一個標題具有相同的標題。 – ceejayoz

回答

2

簡單的答案:如果您的where子句沒有按PK列過濾行,則無法從表中檢索到完全一行。

這是不是100%清楚你想要達到什麼。但是,主鍵用於唯一標識行。這意味着在這種情況下,您應該在where子句中使用offer_id(在原始問題的插入語句中)。

我想你在這之前有一些用戶界面 - 爲什麼你的用戶界面不會將offer_id發送給數據訪問代碼而不是提供名稱?

但是,如果你想插入具有相同名稱和所有者的所有報價以offer_has_tag,試試這個(它是T-SQL的語法,但據我記得它應該在MySQL的工作也):

INSERT INTO `offers_has_tags` (
    offers_id_offer, 
    tags_id_tags 
) 
SELECT id_offer, (SELECT id_tags FROM tags WHERE tags = ?) 
FROM offers WHERE offer = ? AND company = ?) 

請注意,您應該在查詢中使用id_tags而不是標籤名稱。僅爲最終用戶過濾列表時使用描述性屬性。否則,請使用主鍵列。

+0

@ Filip,請看我對丹尼斯的評論。謝謝 – Daniel

+0

@丹尼爾,我剛剛閱讀了這些評論,我很抱歉,但沒人能幫助你,因爲我的答案中用粗體顯示了這句話。如果您篩選的值不唯一(並確保它是唯一的,您在where子句中使用的列必須位於PK或唯一索引中),那麼只能獲取一行。或者我仍然不明白你想達到什麼目的。 –

+0

是的,這是問題所在。標題不可能是唯一的,那麼我如何篩選該優惠?也許時間戳? – Daniel

1

你能更具體一點嗎?在哪種情況下,你是否正在執行sql,爲此目的以哪種方式提供參數?也許發佈這些語句前面的代碼。 這可以幫助回答你的問題。我現在想知道的是,爲什麼要得到多個案例成爲問題?

+0

澄清。具有相同標題的兩個優惠,具有相同所有者,可以使用不同的關鍵字進行標記在我的例子(SQL代碼),如果我做'WHERE offer =「網絡程序員」',我會得到兩個結果,所以我會用相同的標籤標記兩個提議。你明白我的意思嗎 ? – Daniel

+0

不是。我問了一些還沒有回答的問題。很難弄清楚這一切的目的是什麼。我現在唯一想象的是,你有一個網站,你想顯示所有的工作提供一個特定的標題和特定的標籤或東西? –

+0

不。基本上在這個階段,我唯一需要的是標記優惠。用戶編寫報價標題並分配標籤。問題僅限於選擇可以擁有相同所有者和相同標題的獨特報價。我怎樣才能在子查詢中選擇它? – Daniel