从两个表中选择位置

时间:2016-05-17 03:21:04

标签: mysql sql

我是SQL的新手,我在编写以下查询时遇到了困难。

方案

用户有两个地址,家庭住址(App\User)和列表地址(App\Listing)。当访问者搜索郊区或邮政编码或州的列表时,如果用户的列表地址不匹配 - 但如果家庭地址匹配 - 他们也将在搜索结果中。

例如:如果访问者搜索Melbourne,我希望包含来自Melbourne的商家信息以及地址位于Melbourne的用户的商家信息。

预期输出:

user_id first_name  email                  suburb    postcode state
1       Mathew      mathew.afsd@gmail.com  Melbourne 3000     VIC
2       Zammy       Zamm@xyz.com           Melbourne 3000     VIC

表格

用户:

id  first_name  email
1   Mathew      mathew.afsd@gmail.com
2   Zammy       Zamm@xyz.com
3   Tammy       tammy@unknown.com
4   Foo         foo@hotmail.com
5   Bar         bar@jhondoe.com.au

发布信息:

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

3 个答案:

答案 0 :(得分:3)

试试这个。你可以查看它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

答案 1 :(得分:1)

根据我对您的问题的理解,对于任何由访问者提供的郊区,您希望包含用户所在地址与所提供的郊区或列表地址相同的所有列表与提供的郊区相同。

假设addressable_id列与Users表和Listings表的Id相关,则根据addressable_type列中的值,您可以使用以下查询来加入并获得所需的结果:

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'

答案 2 :(得分: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';