我是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
答案 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';