【问题标题】:Select locations from two tables从两个表中选择位置
【发布时间】:2016-05-17 03:21:04
【问题描述】:

我是 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

【问题讨论】:

标签: mysql sql


【解决方案1】:

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

【讨论】:

  • 如何选择latitudelongitude 作为返回列表的查询?
【解决方案2】:

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

假设addressable_id列与Users表和Listings表的Id相关,根据addressable_type列的值,可以使用如下查询进行join,得到想要的结果:

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'

【讨论】:

  • 如果你的表很大并且有适当的索引,我想你应该尽可能使用内连接以获得更好的性能。无论如何,你得到了你的答案,所以不用担心..您可以查看以下链接以获取有关内部连接和左连接的更多信息..inner join vs left join
【解决方案3】:

试试这个,

    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';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多