MYSQL LEFT JOIN返回重复表的结果

时间:2012-03-09 20:34:24

标签: php mysql sql select left-join

更新Scroll to bottem for sql Code and output 我最近开始在公寓数据库上工作。该数据库包含2个表

表“财产”存储有关公寓大楼基本信息(联系信息和照片)。它由列propid

引用

表b“平面图”存储有关个别租赁单位的信息。定价信息,平方英尺和公寓类型。列floorplan也引用propid表,以允许我们将两个表链接在一起。它也有自己唯一的标识符,但未被使用。

每个综合体通常有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 feed上运行过滤器脚本。该脚本将确定givin属性中的最高和最低价格单位,并将这些值添加到属性表price_minprice_max上的2个新创建的列中。到目前为止这已经足够好了,但该公司一直在推动更准确的搜索结果。

我看到的唯一其他选项是只运行查询,只返回DISTINCT propid。然后运行第二个查询以检索实际数据。

$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  

我在发布此评论时遇到了麻烦所以我只是编辑了我的问题。

2 个答案:

答案 0 :(得分:3)

你得到这些重复,因为你要求他们。

你想要

   SELECT DISTINCT p.propid, p.*
     FROM property   AS p 
LEFT JOIN floorplans AS f ON p.propid = f.propid
    WHERE f.price BETWEEN [min_price] AND [max_price]

当您说SELECT ..., f.*时,请为propertyfloorplan的每个不同组合返回一行。但您只需要不同的property项。

通常,拼出您想要的特定列是个好主意。避免p.*检索所有列。当您使用SELECT DISTINCT时,尤其如此。

答案 1 :(得分:1)

我更喜欢它而没有明显的:

SELECT p.*
FROM property AS p 
WHERE EXISTS (SELECT NULL FROM floorplans AS f WHERE f.propid = p.propid AND f.price BETWEEN [min_price] AND [max_price])