2011-09-28 14 views
5

私は人々が家賃を公表できるサイトを開発しています。私は、PHP 5.2.0を使用していますとMySQL 5+他のテーブルに関連する複数のテーブルを結合するには

刊行物が作られた「、私は、このような「インターネット」などの「機能」を持っているdiferentの出版物を、持っているこの

ta_publications 
+---+-------------+------+ 
|id | name  | date | 
+---+-------------+------+ 
| 1 | name_001 | ... | 
| 2 | name_002 | ... | 
| 3 | name_003 | ... | 
+---+-------------+------+ 

のようにテーブルに格納されていますサービス "、"衛星テレビ "など

これらの機能は将来変更される可能性があり、追加/削除/変更できるようにしたいので、それらをデータベースのテーブルに保存します。次の表

ta_publication_features 
+---+-------------+----------------+ 
|id | type_id | publication_id | 
+---+-------------+----------------+ 
| 1 |  1  |  1  | 
| 2 |  2  |  1  | 
| 3 |  3  |  1  | 
+---+-------------+----------------+ 

私はそれを理解するのは簡単だと思うを使用して出版物に関連する

ta_features 
+---+-------------+ 
|id | name  | 
+---+-------------+ 
| 1 | Internet | 
| 2 | Wi-Fi  | 
| 3 | satelital tv| 
+---+-------------+ 

。インターネット、Wi-Fi、衛星テレビを持つname_001という出版物があります。

私はイメージのため、同じデータ・スキーマを持って、私は

ta_images 
+---+-------------+ 
|id | src   | 
+---+-------------+ 
| 1 | URL_1  | 
| 2 | URL_2  | 
| 3 | URL_3  | 
+---+-------------+ 

このテーブルに格納し、出版物にそれらを関連付けるために、次の表を使用し

ta_publication_images 
+---+-------------+----------------+----------+ 
|id | img_id  | publication_id | order | 
+---+-------------+----------------+----------+ 
| 1 |  1  |  1  | 0  | 
| 2 |  2  |  1  | 1  | 
| 3 |  3  |  1  | 2  | 
+---+-------------+----------------+----------+ 

列の順序を提供します1つの出版物のリストを表示する際に、その出版物の順序を表示する必要があります。

Philipp Reichartは特定の機能を持つすべての出版物を検索して取得するクエリを私に提供しました。出版物を掲載するためには機能しますが、必要なデータを返すように変更することはできません。

私はそのクエリを実行し、検索条件をパスしたすべてのパブリケーションを取得し、それらをリストするために別のクエリを使用すると考えました。

これらの刊行物のリストには、すべての出版物データ(ta_publicationsのすべて)+すべての機能+最も重要な(注文0)画像srcが含まれます。

最も重要な画像とそれに付随するすべての機能を別々に返す2つのシンプルクエリーを作成することができますが、ページあたり25個のパブリケーションをリストすると1つの検索クエリ+(2出版物ごとのクエリー* 25の出版物)=明らかにあまり効率的ではない51の異なるクエリー。

EDIT:

私の質問は、どのように私はいくつかのパブリケーションのID与えられた、SQLクエリを作成することができ、返されている:すべての出版物のデータを(ta_publications上のすべてを)+それのすべては+最も重要な(ための機能です0)image src

+0

まあ書か質問が。 :) +投票 – Layke

+0

あなたは実際に質問されていません。あなたが達成しようとしていることを示してください。 –

+0

IDとその機能やトップイメージを含むすべてのパブリケーションを返すクエリを求めていますか? –

答えて

1

あなたはこの1で冗長出版し、画像データを取得しますが、ここでは1つのクエリでそれを行う方法です:あなたはとても新しいですので、

SELECT p.id, p.name, p.date, 
      f.id, f.name, 
      i.id, i.src 
    FROM ta_publications p 
    JOIN ta_publication_features pf ON p.id = pf.publication_id 
    JOIN ta_features f ON f.id = pf.type_id 
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
     AND pi.order = 0 
    JOIN ta_images i ON i.id = pi.img_id 
    WHERE p.id IN ( -- list of publication ids); 
+0

それは動作しますが、あなたが言ったように、冗長なデータを与えます。この冗長データを取得しないようにする方法はありますか? – Daniel

+0

関係の性質を考えて、そのまわりには道はありません。 –

+0

そして、パフォーマンス上の点では、検索クエリを使用してIDを取得し、クエリを使用してリスティングの情報を取得したり、PHPで冗長性を取り除いたり、検索クエリを使用したり、各パブリケーションに対してdo 1クエリを使用してIMGを取得し、2番目のクエリを使用してすべての機能のリストを取得しますか?この2番目のオプションは、予測が簡単で簡単ですが、多くのクエリーを使用します。私は、2番目のオプションで改ページする方が簡単だと思います。どう思いますか? – Daniel

1
Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub 
Join ta_publications_features pf on pf.publication_id = pub.id 
Join ta_features f on f.id = pf.type_id 
Join ta_publication_images pi on pi.publication_id = pub.id 
Join ta_images i on i.id = pi.img_id 
Where pub.id = 'appropriate id' 
order by i.[order] 

あなたの構造に正しく従えば、必要な結合が得られるはずです。 select statmentの結果に希望の列を追加して追加することができます。これが役立つことを願っています。

+0

すべての出版物が必要な場合、そしてトップimgにwhith(i.order = 0)の注文を置き換える場合は、 –

+0

の6つのフィーチャと3つの写真を掲載する場合は、(pub.id = '適切なID'それは私に18行を投げます。それぞれの写真について、6つの行が与えられ、それぞれに異なる機能があります。 – Daniel

+0

pi.order = 0を追加すると少し問題が解決され、各フィーチャの行が返されるようになりました。 – Daniel

関連する問題