Abridged架构看起来像
表:公寓
id | city | price ...
表设施:
id | name
桥接表
Apartment_id | Amenity_id
我想要构建的查询类似于
SELECT * FROM Apartment a
WHERE
a.`city` = 'foo'
AND a.`price` <= 'bar'
UNION
SELECT COUNT(*) as ct FROM Bridging b
WHERE a.id = b.Aprtment_id AND
(b.Amenity_id = 'x' OR b.Amenity_id = 'y' OR b.Amenity_id = 'z')
ORDER BY ct DESC
如果我在代码中执行此操作,我可以迭代找到的公寓,查询舒适性匹配并将该计数添加到对象中的字段并在分页前对其进行排序,但这看起来非常优雅。
查询Bridging表中匹配行数排序的Aprtment记录是一种干净的方法吗?
答案 0 :(得分:2)
SELECT *
FROM
Apartment a
JOIN
(SELECT COUNT(*) as ct, Apartment_id
FROM Bridging
WHERE Amenity_id IN ('x','y','z')
GROUP BY Apartment_id
) b ON a.id = b.Apartment_id
WHERE
a.`city` = 'foo'
AND a.`price` <= 'bar'
ORDER BY
b.bt DESC