【发布时间】:2012-03-27 06:58:13
【问题描述】:
更新滚动到bottem for sql代码和输出 我最近开始研究公寓数据库。该数据库包含 2 个表
表“属性”存储有关公寓大楼的基本信息(联系信息和照片)。它被propid列引用
表 b“平面图”存储有关出租的各个单元的信息。价格信息、面积和公寓类型。 floorplan 表也被 propid 列引用,以允许我们将 2 个表链接在一起。它也有自己的唯一标识符,但未被使用。
每个综合体通常有 5-10 个平面图。
我正在我们的网站上为我们的客户创建一个前端搜索界面。我需要能够搜索具有满足搜索条件的平面图的属性。但是在执行 join 语句时,我注意到每次发现其中一个平面图与搜索条件匹配时,它都会给我一个包含相同属性的列表。
我对这个主题做了一些研究。最常见的答案使用 SELECT DISTINCT。
问题是我需要的不仅仅是作为结果返回的 propid。
我试着做这样的事情:
SELECT DISTINCT (p.propid), p.*, f.* FROM property AS p
LEFT JOIN floorplans AS f ON p.propid = f.propid
WHERE f.pricespecial BETWEEN [min_price] AND [max_price];
[min_price]和[max_price]由用户提供。
预期结果将是具有满足所有用户搜索条件的平面图的所有属性的列表。但我不希望为每个匹配单元返回相同的属性。
当我运行这个查询时,我仍然得到重复的属性
过去我只是简单地在包含数据的 xml 提要上运行一个过滤器脚本。该脚本将确定 givin 属性中的最高和最低价格单位,并将这些值添加到属性表 price_min 和 price_max 上的两个新创建的列中。到目前为止,这已经足够好了,但该公司一直在推动更准确的搜索结果。
我看到的唯一其他选择是只运行查询,只返回 DISTINCT propid。然后运行第二个查询以检索实际数据。
I.E.
$sql = "SELECT DISTINCT p.propid FROM property as f" .
"LEFT JOIN floorplans AS f" .
"WHERE f.price BETWEEN " . $_REQUEST['price_min'] . " AND " . $_REQUEST['price_max'] . "
编辑**
使用新修订的 sql 语句的一些示例输出。
propid name pricespecial
4230A 2222 Smith Street $1225-1450
4230A 2222 Smith Street $1895-2045
4230A 2222 Smith Street $2220
4679A City Place Midtown $1230-1599
4679A City Place Midtown $1595-1650
4679A City Place Midtown $1699-2195
4572A Gables Memorial Hills $1308-2159
4572A Gables Memorial Hills $2050-2693
4606A Venue Museum District $1535-1930
4606A Venue Museum District $1980-2550
我无法将此作为评论发布,所以我只是编辑了我的问题。
【问题讨论】:
-
您已将
f.*包含在您的SELECT中,但我不清楚您是否希望返回这些值。你呢? -
是的,我想要两个表中的所有值,但我只想要不同的 propid 列。输出是包含平面图详细信息的属性列表,因此最终我将从平面图表中过滤掉我不需要的字段,但为了简单起见,假设我想要两个表中的所有数据,但只有一个来自每个属性条目。
-
我不认为我跟随。如果 floorplans 有 5 个给定属性的记录,您说您想查看 5 个平面图但只有 1 个属性?也许尝试添加一个包含您希望看到的示例结果的表格。
-
因此,如果单个属性存在两个平面图,您需要平面图中的数据,但不重复属性信息?那么您的代码是否知道第二行数据中的平面图与前一条记录的属性相匹配?
-
旁注,只需等待有人更改请求并将
price_max设置为1; DROP DATABASE; --。
标签: php mysql sql select left-join