Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MYSQL左联接返回重复的表a结果_Php_Mysql_Sql_Select_Left Join - Fatal编程技术网

Php MYSQL左联接返回重复的表a结果

Php MYSQL左联接返回重复的表a结果,php,mysql,sql,select,left-join,Php,Mysql,Sql,Select,Left Join,更新滚动至bottem以获取sql代码和输出 我最近开始研究一个公寓数据库。该数据库包含2个表 表a“财产”存储有关公寓综合楼的基本信息(联系信息和照片)。它由列propid 表b“楼层平面图”存储了有关单个出租单元的信息。价格信息、面积和公寓类型。floorplan表也被propid列引用,以允许我们将这两个表链接在一起。它也有自己的唯一标识符,但未使用 每个综合体通常有5-10个平面布置图 我正在我们的网站上为我们的客户创建前端搜索界面。我需要能够搜索具有符合搜索条件的平面布置图的房产。但是

更新滚动至bottem以获取sql代码和输出 我最近开始研究一个公寓数据库。该数据库包含2个表

表a“财产”存储有关公寓综合楼的基本信息(联系信息和照片)。它由列
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];
[最低价格]
[最高价格]
由用户提供

预期结果将是具有符合所有用户搜索条件的平面布置图的所有属性的列表。但我不希望每个匹配单元都返回相同的属性

当我运行此查询时,仍然会得到重复的属性

在过去,我只是简单地在包含数据的xml提要上运行一个过滤脚本。脚本将确定givin属性中的最高和最低价格单位,并将这些值添加到属性表
price\u min
price\u max
上新创建的两列中。到目前为止,这已经足够好了,但该公司一直在推动更准确的搜索结果

我看到的唯一的另一个选项是只使用返回的不同的propid运行查询。然后运行第二个查询以检索实际数据

编辑**

使用新修订的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  

我很难将此作为评论发布,所以我只是编辑了我的问题。

您收到这些DUP是因为您需要它们

你想要

   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.*
时,请为
property
floorplan
的每个不同组合返回一行。但您只需要不同的
属性


总的来说,把你想要的特定栏目详细列出来是个好主意。避免使用
p.*
检索所有列。当您使用
选择DISTINCT
时尤其如此我更喜欢不使用DISTINCT:

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])

您已将
f.*
包含在
SELECT
中,但我不清楚您是否希望返回这些值。是吗?是的,我想要两个表中的所有值,但我只想要不同的propid列。输出是一个包含floorplan详细信息的属性列表,因此最终我将从floorplan表中筛选出不需要的字段,但为了简单起见,让我们假设我需要两个表中的所有数据,但每个属性条目中只有一个数据。我想我不会这样做。如果楼层平面图具有给定属性的5条记录,则表示希望查看5条楼层平面图,但仅查看1个属性?也许可以尝试添加一个表,其中包含一些您希望看到的示例结果。因此,如果单个属性存在两个平面布置图,您希望从平面布置图中获取数据,但不重复属性信息?然后,您的代码是否知道第二行数据中的平面图与前一条记录的属性相匹配?请注意,只需等待有人更改请求并将
price\u max
设置为
1;删除数据库--。我肯定他想要一个内部连接,因为条件是基于Floorplan表中的信息。在发布代码时遇到问题这一定是我用过的最糟糕的评论系统。你的天才Nikola工作得很好。也许你愿意解释一下背后的逻辑——我不太明白。但它确实有效。当然。子查询(在括号中选择)以通常的方式选择行,但有一个例外:它通过f.propid=p.propid连接到主查询。Exists检查是否返回一行,如果返回,则计算结果为true。如果您不需要相关行中的任何数据,但只需要检查其中一行是否满足某些条件,就可以使用它,因为它通常比join快-它只需要建立匹配,而不返回任何数据,因此在选择列表中为null(不必,但我喜欢它)。假设我希望包含来自Floorplan表的数据。我也可以使用这个语句,只是用必填字段替换null吗?@Dean不,你不能,这就是为什么我在评论中提前问你是否需要floorplan表中的任何数据。拥有floorplan数据不是绝对必要的。但是属性表不包含定价信息,因此,在尝试显示列表时,我想我可以根据需要使用第二条语句来提取楼层平面图,一旦从您以前的答案中检索到属性列表。但如果你知道我如何在一个select语句中做到这一点,那就太棒了。然而,我知道有些连接查询变得太复杂,它们需要更长的时间来重试,所以第二个查询可能是更好的选择。
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])