2011-12-13 26 views
0

我想我需要一個提示,指出要走向哪個方向。 繼續我的other question,我試圖在3個表上執行sql查詢,並使用MySQLSQL:JOIN和其他表的基礎知識

表1:產品 「基地」 信息

id, productnumber 
1,45 

表2: 「country_specifics」 爲每個產品ID

id, countrycode,name 
1,"DE","Produkt 1" 
1,"US","Product 1" 

好的,一個

SELECT B.id,C.name,C.countrycode 
FROM base AS B 
INNER JOIN country_specifics AS C ON B.id=C.id 
WHERE B.id=1 AND C.countrycode='US'; 

給我我想要的:

1,"Product 1","US" 

但是:

我的第三個表:

表3: 「功能」 爲每個產品ID

id,feature 
1,"feature 1" 
1,"feature 2" 

和我的查詢的最終結果應該以某種方式additionaly包含產品具有的功能。 我想,有另外

INNER JOIN features AS F ON b.id=f.id 

,但將返回兩行(我明白爲什麼):

1,"Product 1","US","feature 1" 
1,"Product 1","US","feature 2" 

,但我覺得這不是我想要的。 我要的是爲特徵域排序數組:

1,「產品1」,「美國」,「功能1,功能2」

結果。我知道(或者相當肯定)SQL中沒有數組,但最接近的是什麼?我可以在1個查詢中做到這一點嗎?顯然,我可以簡單地開始第二個查詢,但這是最好的選擇嗎? 對於哪個關鍵字我應該谷歌?

感謝您的閱讀,馬林巴

編輯

謝謝大家的幫助,真的!

我只是想澄清我的問題:我不一定需要一個數組或接近它的東西。我想了解什麼是最好的(最有效的,最不容易出錯的)方法是獲得「該產品的所有數據」。

如果您告訴我接受2行作爲結果,並且使用這是最好的方法,那麼我會這樣做。 我只是想當他們設計SQL時,他們想到了這個問題並準備好了一個解決方案,我正在努力尋找解決方案。

編輯2:

我再次道歉誤導別人以爲我需要一個逗號分隔的字符串。我試圖說明我期待什麼樣的數據。

我欣賞指向group_concat的指針,但我有感覺stored procedure與2查詢,由jmacinnes和薩欽概述,是更清潔的方式。

謝謝,stackoverflow社區。

+0

這是針對Sybase ASE,SQL Server,Oracle,MYSQL嗎? – 2011-12-13 17:12:05

+0

mysql - 從第一段的第二句開始。 – 2011-12-13 17:18:24

+0

@marimba - **你使用MySQL嗎? (在解決這個問題時,不同風格的SQL有不同的方法。) – 2011-12-13 17:49:09

回答

1

我認爲你應該使用你已經寫過的單個查詢來完成它。然後,簡單地將數據格式化爲在應用程序層中以您想要的方式顯示。您可以遍歷結果並將每個產品的所有功能組合在一起。

雖然有可能返回您之後的結果集,但這樣做會是一個糟糕的做法。如果將來要更改功能表,將會使數據分析困難得多。

如果你想通過加入到功能表中獲取的複製數據顯著,那麼你可以在一個單一的存儲過程返回兩個結果集:

SELECT B.id,C.name,C.countrycode 
FROM base AS B 
INNER JOIN country_specifics AS C ON B.id=C.id 
WHERE B.id=1 AND C.countrycode='US'; 

SELECT id featureId FROM features where ProductId = 1 
2

您可以編寫一個函數或一個存儲過程,它接受一個id,然後爲features表返回一個字符串,其中包含具有該id的所有功能。然後你可以在原來的查詢中使用它。

1

因爲你正在使用MySQL,你可以使用GROUP_CONCAT :

SELECT B.id,C.name,C.countrycode, group_concat(F.feature) as feature_list 
FROM base AS B 
INNER JOIN country_specifics AS C ON B.id=C.id 
WHERE B.id=1 AND C.countrycode='US' 
INNER JOIN features AS F ON B.id=F.id 
GROUP BY B.id 
1

下面的解決方案是基於Oracle,你可以嘗試實現同樣在MySQL

您可以創建一個數據庫函數如下

create or replace function prod_feature(p_product_id in number) return varchar2 
    v_feature varchar2(2000) := ''; 
    i number := 0 ; 
begin 
    for c1rec in (select feature from table3 where product_id = p_product_id) loop 
     if i = 0 then 
      v_feature:= v_feature|| c1rec.feature; 
     else 
      v_feature:= v_feature|| ', ' || c1rec.feature; 
     end if; 
     i := i +1; 
    end loop; 
    return v_feature; 
end; 

然後在第一個SQL

SELECT B.id,C.name,C.countrycode, prod_feature(id) 
FROM base AS B 
INNER JOIN country_specifics AS C ON B.id=C.id 
WHERE B.id=1 AND C.countrycode='US'; 
0

這樣如何使用此功能。試試這個,看看它是否按照你想要的方式工作。

SELECT id, name, code, GROUP_CONCAT(fea) features FROM 
( 
    SELECT id, name, code, f.feature fea FROM 
    (
    SELECT b.id id, cs.name name, cs.countrycode code FROM 
    base b 
    JOIN country_specifics cs 
    ON cs.id = b.id 
    AND cs.countrycode = "US" 
    ) a 
JOIN features f 
ON f.id = a.id 
) b 
GROUP BY id