2016-05-17 9 views
1

私はSQLを初めて使用しており、次のクエリを書くのが難しいです。2つのテーブルから場所を選択

シナリオ

ユーザーには2つのアドレス、ホームアドレス(App\User)と上場アドレス(App\Listing)を持っています。訪問者が郊外または郵便番号または州のリストを検索したときに、ユーザーのリストアドレスが一致しない場合 - 自宅住所が一致する場合、検索結果にも表示されます。

たとえば、訪問者がMelbourneを検索した場合、Melbourneのリストと住所がMelbourneのユーザーのリストを含めるとします。

予想される出力:

user_id first_name email     suburb postcode state 
1  Mathew  [email protected] Melbourne 3000  VIC 
2  Zammy  [email protected]   Melbourne 3000  VIC 

テーブル

ユーザー:

id first_name email 
1 Mathew  [email protected] 
2 Zammy  [email protected] 
3 Tammy  [email protected] 
4 Foo   [email protected] 
5 Bar   [email protected] 

リスト:

id user_id hourly_rate description 
1 1  30   ABC 
2 2  40   CBD 
3 3  50   XYZ 
4 4  49   EFG 
5 5  10   Efd 

アドレス:

id addressable_id addressable_type post_code suburb  state latitude longitude 
3584 1   App\\User   2155  Rouse Hill NSW -33.6918372 150.9007221 
3585 2   App\\User   3000  Melbourne VIC -33.6918372 150.9007221 
3586 3   App\\User   2000  Sydney  NSW -33.883123 151.245969 
3587 4   App\\User   2008  Chippendale NSW -33.8876392 151.2011224 
3588 5   App\\User   2205  Wolli Creek NSW -33.935259 151.156301 
3591 1   App\\Listing  3000  Melbourne VIC -37.773923 145.12385 
3592 2   App\\Listing  2030  Vaucluse NSW -33.858935 151.2784079 
3597 3   App\\Listing  4000  Brisbane QLD -27.4709331 153.0235024 
3599 4   App\\Listing  2000  Sydney  NSW -33.91741 151.231307 
3608 5   App\\Listing  2155  Rouse Hill NSW -33.863464 151.271504 
+1

結合または共用体を使用できます。これが役立つかどうかを確認してください。http://www.techrepublic.com/article/sql-basics-query-multiple-tables/ – mtrueblood

+0

希望の出力を投稿することもできますが、理解しやすくなります –

答えて

3

はこれを試してみてください:

と仮定addressable_id列がaddressable_type列の値に基づいて、ユーザーテーブルと一覧表のIDに関連して、あなたが参加し、望ましい結果を得るために次のクエリを使用することができます。あなたはそれを確認することができますhere

SELECT l.* 
FROM listings l 
LEFT JOIN addresses a_l ON a_l.addressable_id = l.id 
    AND a_l.addressable_type = "App\\Listing" 
    AND a_l.suburb = "Melbourne" 
LEFT JOIN addresses a_u ON a_u.addressable_id = l.user_id 
    AND a_u.addressable_type = "App\\User" 
    AND a_u.suburb = "Melbourne" 
WHERE a_l.id IS NOT NULL OR a_u.id IS NOT NULL 
+0

リストを返すクエリとして 'latitude'と' longitude'をどのように選択するのですか? –

+0

決して私はそれを考え出していないhttp://sqlfiddle.com/#!9/54a0376/8 –

0

は、あなたの質問の私の理解あたりとして

SELECT 
      a.addressable_id AS `userid`, 
      b.first_name  AS `username` 
    FROM 
      addresses AS a JOIN users AS b ON a.addressable_id=b.id 
    WHERE 
      a.suburb = 'Melbourne'; 


    if <addressable_id> has relation with <id> in listing table, 



    SELECT 
      a.addressable_id AS `userid`, 
      b.first_name  AS `username` 
    FROM 
      addresses AS a JOIN users AS b ON a.addressable_id=b.id AND addressable_type='App\\User' 
    WHERE 
      a.suburb = 'Melbourne' 
    UNION 
    SELECT 
      b.user_id AS `userid`, 
      c.first_name  AS `username` 
    FROM 
      addresses AS a JOIN listings AS b ON a.addressable_id=b.id AND addressable_type='App\\Listing' 
          JOIN users AS c ON b.user_id=c.id 
    WHERE 
      a.suburb = 'Melbourne'; 
1

これを試すには、いずれかの郊外のために - 訪問者によって提供される、ユーザーのいずれかのアドレスがあるすべてのリストを含めます提供された郊外と同じ、またはリストの住所は提供された郊外と同じです。

Select l.* 
From Listings l 
    inner join Addresses a on ((a.addressable_id = l.user_Id and a.addressable_type = 'App\\User') or (a.addressable_id = l.Id and a.addressable_type = 'App\\Listings')) 
    inner join Addresses a1 On a1.addressable_id = a.addressable_id and a1.Suburb = 'Melbourne' 
+0

ありがとうございます。私はすぐにクエリをチェックします。 –

+0

テーブルが大きく索引付けが適切な場合は、パフォーマンスを向上させるためにできる限り内部結合を使用する必要があります。とにかく、あなたはあなたの答えを持っているので、心配は..あなたは内部の結合と左の結合の詳細については、次のリンクを確認することができます.. [内部結合対左結合](http://stackoverflow.com/questions/2726657/inner -join-vs-left-join-performance-in-sql-server) – Nagahornbill

関連する問題