【问题标题】:Return all data from 1st Table, and only 1 data from 2nd Table if exist返回第一个表中的所有数据,如果存在,则返回第二个表中的 1 个数据
【发布时间】: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?

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

【问题讨论】:

    标签: mysql


    【解决方案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。非常感谢您的解决方案!
    猜你喜欢
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多