2012-03-09 10 views
4

update SQLのためにbottemにスクロールコードと出力 最近アパートデータベースの作業を開始しました。データベースには2つのテーブルが含まれていますMYSQL LEFT JOIN結果を重複テーブルに返す

テーブル「プロパティ」には、基本的な情報(連絡先と写真)があります。それは列によって参照されますpropid

表b "floorplans"は家賃のための個々の単位についての情報を格納します。価格情報、平方フィート、アパートタイプなどがあります。また、floorplanテーブルは、propidカラムによって参照され、2つのテーブルをリンクすることができます。独自の一意識別子もありますが、未使用です。

通常、1つのコンプレックスあたり5~10のフロアプランがあります。

私は、私たちのウェブサイトでお客様のフロントエンド検索インターフェースを作成しています。私は、検索基準を満たすフロアプランを持つプロパティを検索する機能が必要です。ジョインステートメントを実行するとき、フロアプランの1つが検索基準に一致するたびに、同じプロパティを持つリストを私に与え続けていることがわかりました。

私はこのテーマについていくつかの研究を行った。最も一般的な答えはSELECT DISTINCTです。

問題は、結果として返されるpropid以上が必要なことです。

私はこのような何かをやってみました:

SELECT DISTINCT (p.propid), p.*, f.* FROM property AS p 
LEFT JOIN floorplans AS f ON p.propid = f.propid 
WHERE f.pricespecial BETWEEN [min_price] AND [max_price]; 

[min_price][max_price]は、ユーザによって提供されています。

結果として、すべてのユーザー検索条件を満たすフロアプランを持つすべてのプロパティのリストが作成されます。しかし、私はすべての単一の一致するユニットのために返される同じプロパティを望んでいません。

私はこのクエリを実行すると、私はまだ過去には、重複する性質に

を取得し、私はただ単にデータを含むXMLフィードにフィルタスクリプトを実行しました。スクリプトは、givinプロパティの最高価格と最低価格を決定し、それらの値をプロパティテーブルprice_minprice_maxの新しく作成された2つの列に追加します。今までこれで十分でしたが、同社はより正確な検索結果を求めています。

私が見る唯一のオプションは、DISTINCT propidだけが返されたクエリを実行することです。その後、2番目のクエリを実行して実際のデータを取得します。

I.E.

$sql = "SELECT DISTINCT p.propid FROM property as f" . 
     "LEFT JOIN floorplans AS f" . 
     "WHERE f.price BETWEEN " . $_REQUEST['price_min'] . " AND " . $_REQUEST['price_max'] . " 

EDIT * *

新しく改訂されたSQLなステートメントを使用して、いくつかのサンプル出力。

propid name pricespecial 
4230A 2222 Smith Street $1225-1450 
4230A 2222 Smith Street $1895-2045 
4230A 2222 Smith Street $2220 
4679A City Place Midtown $1230-1599 
4679A City Place Midtown $1595-1650 
4679A City Place Midtown $1699-2195 
4572A Gables Memorial Hills $1308-2159 
4572A Gables Memorial Hills $2050-2693 
4606A Venue Museum District $1535-1930 
4606A Venue Museum District $1980-2550 

これをコメントとして投稿していたので、私は質問を編集しました。

+0

あなたは 'F *'あなた 'SELECT'内を含めましたが、それはあなたがそれらの値が返されるかどうか私にははっきりしません。あなたは? – hvd

+0

はい両方のテーブルのすべての値が必要ですが、私は別個のpropidカラムのみが必要です。出力はフロアプランの詳細を含むプロパティのリストなので、最終的にフロアプランテーブルから不要なフィールドを除外しますが、簡単にするために、両方のテーブルのすべてのデータを必要とすると仮定します。各プロパティエントリ。 – Dean

+0

私は私が従うとは思わない。フロアプランに5つのレコードがある場合は、5つのフロアプランを表示したいが1つのプロパティのみを表示したいとしますか?たぶん見たいと思ういくつかのサンプル結果を含むテーブルを追加しようとします。 – Mike

答えて

3

あなたがこれらのダンプを求めているからです。あなたが言っているSELECT ..., f.*を言うとき

あなたは

SELECT DISTINCT p.propid, p.* 
    FROM property AS p 
LEFT JOIN floorplans AS f ON p.propid = f.propid 
    WHERE f.price BETWEEN [min_price] AND [max_price] 

をしたい、 propertyfloorplanのすべての明確な組み合わせのための行を私に戻って与えます。しかし、唯一別の propertyアイテムが必要です。

一般に、必要な特定の列を記入することをお勧めします。 p.*を避けてすべての列を検索してください。これは特にSELECT DISTINCTを使用している場合に当てはまります。

+1

フロアプランテーブルの情報に基づいているため、INNER JOINが必要です。 – joakimdahlstrom

+0

いくつかのコード – Dean

+0

を投稿しようとしているcomentなものに問題がありますこれは私が今までdeltをコメントしている最悪のシステムでなければなりません – Dean

1

私は明確ななしより良いそれを好き:。

SELECT p.* 
FROM property AS p 
WHERE EXISTS (SELECT NULL FROM floorplans AS f WHERE f.propid = p.propid AND f.price BETWEEN [min_price] AND [max_price]) 
+0

OMGあなたの天才Nikola作品。おそらく、あなたはそれの背後にある論理を説明するのに気を使うでしょう。しかし、それは動作します。 – Dean

+0

サブクエリ(括弧で囲んで選択)は、1つの例外を除いて通常の方法で行を選択します。f.propid = p.propidによってメインクエリに結合されます。 Existsは行が返されたかどうかをチェックし、そうであればtrueを返します。関連する行のデータは必要ないが、条件の1つが条件を満たすかどうかを確認する必要がある場合にのみ使用する。結合よりも高速なことが多いため、一致を確立してデータを返さないでください。リスト(必要はありませんが、私はそれが好きです)。 –

+0

フロアプランテーブルのデータを含めるとします。この文を使用して、必要なフィールドにnullを置き換えるだけでいいですか? – Dean

関連する問題