2012-02-17 6 views
2

私はMySQL DBを使用していますが、結果を組み合わせようとしています。私のSQLチョップは、これを達成する方法を考え出すのに十分な経験はありません。クエリの行を結合するSQL

この図は私の目的とdb構造を説明しています。 http://i.stack.imgur.com/x6dCo.png

これは私が使用したものである。

SELECT 
     LISTITEMS.ID, 
     LISTITEMS.ItemName, 
     PROPVALUE.PropValue, 
     LISTPROPERTIES.PropName 
FROM LISTITEMS 
INNER JOIN PROPVALUE 
    ON LISTITEMS.ID = PROPVALUE.ItemID 
INNER JOIN LISTPROPERTIES 
    ON LISTPROPERTIES.ID = PROPVALUE.PropID 
WHERE LISTITEMS.ListID = '$_GET[ID]' 

これは2行を返し、私は(私は他の2つのテーブルから「ID」列を編集)1行を必要とします。

ID ItemName PropValue ListID  PropName 
1 item 1 PropValue1  1  Property1 
1 item 1 PropValue2  1  Property2 

編集所望の出力:

ID ListID ItemName PropName1 PropValue1 PropName2 PropValue2 
1 1  Item 1 Property1 PropValue1 Property2 PropValue2 
+2

どのように組み合わせる必要がありますか? 'PropValue'と' PropName'は異なります。出力をどのように表示するかの例を投稿してください。 –

+0

(ところで、 '$ _GET ['ID']'が正しい整数であることを既に確認していると仮定します。そうでなければ、SQLインジェクションに対して脆弱です...) –

+0

待ってください。より密接に画像。私はあなたの意図に合っていますか? –

答えて

3

プロパティ名が動的に異なりますので、GROUP_CONCAT()にそれらを結合して、アプリケーション層でそれらを分離することがはるかに容易になるだろう。

編集:すべてのあなたのJOIN Sを含むように修正されたクエリ:

SELECT 
     LISTITEMS.ID, 
     LISTITEMS.ItemName, 
     GROUP_CONCAT(CONCAT_WS('|', LISTPROPERTIES.PropName, PROPVALUE.PropValue)) AS Properties 
FROM LISTITEMS 
INNER JOIN PROPVALUE 
    ON LISTITEMS.ID = PROPVALUE.ItemID 
INNER JOIN LISTPROPERTIES 
    ON LISTPROPERTIES.ID = PROPVALUE.PropID 
WHERE LISTITEMS.ListID = '$_GET[ID]' 
GROUP BY LISTITEMS.ID, LISTITEMS.ItemName 

この意志の出力は次のよう:name|valueキー&値を得るために、その後のペアを取得するための最初の,上のPHPコードで次に

ID ItemName Properties 
1 Item1  Property1|PropValue1,Property2|PropValue2,Property3|PropValue3 

explode()性質、explode()|上のものの各。