2012-05-03 17 views
0

我有3個表,我試圖在下面佈局。我無法堅持。我沒有做過很多的查詢,之前從來沒有加入過,我真的很困惑這是怎麼回事。示例查詢我本來會用簡單的英語,掙扎寫作我的第一個連接查詢

得到所有portfolio_item_ids從skill_area其中web_design =「1」, 然後讓所有從與portfolio_item_ids 則每行的ID值portfolio_items行,得到標籤的行,其中portfolio_item_id等於portfolio_item_id和插畫家之一的值,Photoshop或CSS是1

QUERY我設法拿出


SELECT portfolio_item_id

FROM skill_area小號

WHERE web_design = 1


SELECT *

FROM portfo lio_items p

WHERE p.id = s.portfolio_item_id


SELECT *

FROM標籤噸

WHERE s.portfolio_item_id =噸。portfolio_item_id


所以我認爲這是正確的,我只需要加入它現在一起


投資組合項目

ID

ITEM_NAME

描述

技能領域

portfolio_item_id

網頁設計

品牌

打印

標籤

portfolio_item_id

插畫

的Photoshop

CSS

+0

,則應該更換部分「和值= 1」,因爲這是令人困惑的。嘗試'和插圖畫家,Photoshop或CSS之一的價值是1' –

+0

已經完成謝謝 – Nicola

回答

2

打破它的步驟,就像你在你的 '純英文' 語句有:

  1. 得到web_design skill_area的

    select * from skill_area where web_design = '1' 
    
  2. 與portfolio_items加入

    select * 
    from skill_area s, portfolio_items p 
    where web_design = '1' 
        and p.id = s.portfolio_item_id 
    
  3. 加入與標籤,選擇行其中value = 1,並返回剛剛從標籤表中的列)

    select t.* 
    from skill_area s, portfolio_items p, tags t 
    where web_design = '1' 
        and p.id = s.portfolio_item_id 
        and p.id = t.portfolio_item_id 
        and t.value = '1' 
    
+0

我只是讀通過這試圖遵循,一步一步的指示使它更簡單!我認爲這些字母是表格的縮寫?在第3號,它開始選擇t,井t沒有被定義在任何地方,所以它怎麼知道它是什麼? – Nicola

+0

是的,這些字母是縮寫(它們被稱爲別名)。仔細看看......'t'是'標籤'的別名。 –

+0

+1需要時間解釋。 –

1

試試這個:

SELECT sa.portfolio_item_id, pi.*, subtags.* 
FROM skill_area sa 
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id 
INNER JOIN (SELECT CASE WHEN illustrator = '1' THEN 'illustrator' 
         WHEN photoshop = '1' THEN 'photoshop' 
         ELSE 'css' END as tag, portfolio_item_id 
      FROM tags) subtags ON sa.portfolio_item_id = subtags.portfolio_item_id 
WHERE sa.web_design = '1' 

你的評論,你想有一個替代的,你只得到標籤的所有列。

SELECT sa.portfolio_item_id, pi.*, tags.* 
FROM skill_area sa 
INNER JOIN portfolio_items pi ON sa.portfolio_item_id = pi.id 
INNER JOIN tags ON sa.portfolio_item_id = tags.portfolio_item_id 
WHERE sa.web_design = '1' 
+0

謝謝!我還應該提到,我需要能夠在標籤值爲1的情況下獲取列名,相應的結果是否會包含列名的詳細信息? – Nicola

+0

我看到了,所以你不想要三列(有值0,0,1),但有列的名字......只需一秒鐘我就會修復它。 –

+0

不,我希望列名在哪裏值=「1」作爲結果的一部分 – Nicola

0
SELECT  P.* 
FROM  SkillArea S 
INNER JOIN Portfolio P ON S.portfolio_item_id = P.id 
INNER JOIN Tags T ON T.portfolio_item_id = P.id 
WHERE  S.web_design = 1 
AND   P.id = 1 
+0

他不希望S –

+0

謝謝你!我還應該提到,我需要能夠在標籤值爲1的情況下獲取列名,相應的結果是否會包含列名的詳細信息? – Nicola

+0

'標籤'表是否有一個ID字段? – weenoid

0

這裏是這樣的查詢可能是什麼樣子。我試圖逐字逐句翻譯您的英語變體,以幫助您理解,並將註釋用於描述表情。

select s.portfolio_item_id, p.*, t.* 
from Skill_Area s         -- get all portfolio_item_ids from skill_area 
inner join Portfolio_Items p on     -- then get all the rows from portfolio_items 
    p.portfolio_item_ids = s.portfolio_item_ids -- with the id values of portfolio_item_ids 
inner join Tags t on        -- then for each row, get the row from tags 
    t.portfolio_item_id = p.portfolio_item_id  -- where portfolio_item_id is equal to portfolio_item_id 
    and t.portfolio_item_id = 1     -- and the value of it is 1 
where s.web_design = "1"       -- where web_design = "1"