返回第一个表中的所有数据,如果存在,则返回第二个表中的 1 个数据

Posted

技术标签:

【中文标题】返回第一个表中的所有数据,如果存在,则返回第二个表中的 1 个数据【英文标题】:Return all data from 1st Table, and only 1 data from 2nd Table if exist 【发布时间】:2018-05-14 12:10:30 【问题描述】:

我正在使用 mysql

我有 2 个表,一个是名称和数据的列表,主键为 propertyId。

表 2 包含具有主键 propertyImageId 的图像。

每个 propertyId 可能有多个图像或根本没有图像。

我需要获取所有属于agentId = 1的propertyId的列表,无论它是否有图像。

'SELECT a.*, b.* 
FROM property a LEFT OUTER JOIN property_images b 
ON a.propertyId = b.propertyId 
INNER JOIN 
( SELECT propertyId, MAX(created) maxCreated 
FROM property_images 
GROUP BY propertyId) c 
ON b.propertyId = c.propertyId ANd b.created = c.maxCreated 
WHERE agentId = 1 ');

我正在尝试此处提供的类似解决方案 MySQL INNER JOIN select only one row from second table

但是,如果图像存在,它只会返回 propertyId。无论property_images是否存在,我该怎么做才能从属性中返回所有propertyId?

一直致力于此,任何帮助将不胜感激。谢谢!!

【问题讨论】:

【参考方案1】:

您可以如下重写您的查询,内部查询为每个属性 id 获取单个图像,并具有最高创建的列值

SELECT 
  a.*,
  b.* 
FROM
  property a 
  LEFT JOIN 
    (SELECT 
      c.* 
    FROM
      property_images c 
      LEFT JOIN property_images d 
        ON c.propertyId = d.propertyId 
        AND c.created < d.created 
    WHERE d.propertyId IS NULL) b 
    ON a.propertyId = b.propertyId 
WHERE a.agentId = 1 

【讨论】:

非常感谢!它似乎正在工作,除了因为属性表和 property_images 表 i 都使用字段名称“propertyId”,结果集在图像不存在时将 propertyId 返回为 NULL。 我通过从 property_images 中单独选择字段而不指定 propertyId 来解决此问题,因此 null 不会覆盖属性表中的 propertyId。非常感谢您的解决方案!

以上是关于返回第一个表中的所有数据,如果存在,则返回第二个表中的 1 个数据的主要内容,如果未能解决你的问题,请参考以下文章

如果第二个表不存在连接,Mysql 使用一个表中的列值

sql server 2000返回在第一个表中但不在第二个表中的数据

LEFT JOIN,如果存在第二个表的结果,则添加到 PHP 中的数组

Haversine 公式,PHP,如果条件适用,则添加到第二个表中

mysql查询加入,比较两个表并返回第一个表中的所有记录

jQuery表单验证