2013-01-13 24 views
0

我是新來的SQL,並建立一個MySQL和PHP應用程序。 我可能會計劃表錯誤,如果是的話,會感謝任何想法。Sql表與3列的第二個表ids

我有塊包含一些列,包括標題,文本,口號。 標題和文字看起來都比較複雜,因爲我需要字體,大小以及每個文本的批准。所以我創建了這些列的文本表。 這些都是表:

blocks 
id(increment),text(texts.id),title(texts.id),slogan(texts.id), 
type(enum),time(datetime),difficulty(int) 

texts 
id(increment),Text(text),font(varchar),size(int),approval(approval.id) 

aprrovals 
id(increment), User(varchar), time(datetime) 

所以這裏的問題:

  1. 這是保存這些信息的好方法?我應該只是讓textx保存它們所屬的塊ID?
  2. 我如何顯示包含所有塊的列的表,但是顯示的是texts.Text而不是ID的實際文本?
  3. 如何選擇特定塊的特定文本的批准。用戶?

回答

0

如果我正確理解你的問題,我不認爲有必要擁有Approvals表格。如果一個文本可以有且只有一個用戶批准它,並且它可以在唯一的一個日期上批准,那麼不需要分開批准。

我應該只是讓textxs擁有它們所屬的塊ID嗎?

我認爲這取決於你的造型需求。它總是一個文本,一個標題和一個口號,這三個都必須填寫嗎?如果是這樣,就像你現在所做的那樣,不要緊。但是,如果您經常會看到一個只有文本而沒有標題和口號的塊,那麼創建文本引用塊可能更有意義。

我該如何顯示包含所有塊的列的表格,但是顯示的是texts.Text而不是ID的實際文本?

像這樣的東西應該讓你開始:

SELECT b.id, text.text, title.text, slogan.text, b.type, b.time, b.difficulty 
FROM blocks AS b 
JOIN texts AS text ON b.text = texts.id 
JOIN texts AS title ON b.title = texts.id 
JOIN texts AS slogan ON b.slogan = texts.id 

如何選擇一個specifi塊的特定文本的approval.User?

SELECT a.user 
FROM approvals AS a 
JOIN texts AS t ON a.id = t.approval 
JOIN blocks AS b ON b.text = t.id 
WHERE b.id = idToLookFor 
+0

非常感謝。 – noam

+0

不客氣。如果您發現llion或我的答案是正確的,請記住標記爲正確,以便任何具有相同問題的人都能看到答案。 –

1

你的第一個問題是其中唯一的人誰能夠真正回答這是你的,但是從你的描述,這似乎是明智的。命名「Text」列不是最好的想法,因爲它是mysql中的保留字。您必須始終記住要跳過列名稱。我會建議像「身體」,而不是。 (我相信時間和類型,以及。)

你接下來的兩個問題需要的JOIN的理解。根據您定義的標準,JOIN允許您將兩個表連接在一起。我將以相反的順序回答問題,因爲你的第二個問題將是一個更復雜的聯接。

所以3)文本和誰批准他們的用戶:

SELECT 
    t.`id`, t.`Text`, a.`User` 
FROM 
    texts t 
INNER JOIN 
    approvals a 
ON 
    t.approval=a.id; 

這將返回文本標識,文本和用戶名已被批准的任何行。如果您還想在沒有批准的情況下查看,請將INNER JOIN更改爲LEFT JOIN。這將始終返回ON語句左手邊的表中的行。

現在,返回所有塊的問題是您將需要多次加入文本表。這使得它更復雜一些,但它很容易做到:

SELECT 
    t1.`Text` as 'Title', 
    t2.`Text` as 'Slogan', 
    t3.`Text` as 'Body', 
    b.`type` as 'Type', 
    b.`time` as 'Time' 
    b.`difficulty` as 'Difficulty' 
FROM 
    blocks b 
INNER JOIN 
    texts t1 
ON 
    b.`title` = t1.`id` 
INNER JOIN 
    texts t2 
ON 
    b.`slogan` = t2.`id` 
INNER JOIN 
    texts t3 
ON 
    b.`text` = t3.`id`; 
+0

非常感謝,它爲我工作 – noam

+0

太棒了!您是否可以點擊答案旁邊的複選標記將其標記爲已接受?謝謝。 :) – Ilion

相關問題