【问题标题】:SQL - Select value with newest dateSQL - 选择具有最新日期的值
【发布时间】:2022-01-20 22:59:05
【问题描述】:

我正在尝试从我的表中选择具有最新日期的附加值“状态”,但前提是左连接表对象可见。每个物业和单位只有一次。 到目前为止我做了什么:

SELECT propertyUnitEnergyStates.id,
       propertyUnitEnergyStates.property_id,
       propertyUnitEnergyStates.unit_id,
       propertyUnitEnergyStates.type,
       propertyUnitEnergyStates.state,
       propertyUnitEnergyStates.date,
       propertyUnits.visible
  FROM propertyUnitEnergyStates
  LEFT JOIN propertyUnits
    ON propertyUnits.property_id = $propertyID
 WHERE propertyUnitEnergyStates.property_id = $propertyID
   AND propertyUnitEnergyStates.type = '$name'
   AND propertyUnits.visible = 1
 GROUP BY propertyUnitEnergyStates.unit_id
 ORDER BY propertyUnitEnergyStates.date DESC

我现在得到的是每个 propertyUnits.visible 为 1 的结果。即使在表中设置为零。

来自 propertyUnits 的对象。如您所见,可见值为 0,但我得到 1。

现在我注意到,我想成为最新的“状态”值不是最新的。

如您所见,我的结果中 unit_id 5 值为 853,但表中的 propertyUnitEnergyStates 是最新值 400。

【问题讨论】:

  • 请将数据发布为文本而不是图像。
  • 我明白了。首先,order by 子句在 group by 子句之后执行。所以......你不能从这个查询中得到最新的状态。您必须在离开加入之前获得最新状态。让我检查一下。

标签: php sql


【解决方案1】:

我尝试了不同的选项,但仍然无法获得结果。它仍然忽略可见属性并且不返回按日期的最后一条记录。

这是我最后一次尝试:

$query = "SELECT UniEne.id, 
        UniEne.property_id, 
        UniEne.unit_id, 
        UniEne.type, 
        UniEne.state, 
        UniEne.date, 
        propUni.visible 
        FROM 
        (SELECT * FROM propertyUnitEnergyStates WHERE type = '$name' AND property_id = $propertyID ORDER BY date DESC) AS UniEne 
        INNER JOIN (SELECT * FROM propertyUnits WHERE property_id= $propertyID AND visible = 1) as propUni
        WHERE UniEne.property_id = $propertyID GROUP BY UniEne.unit_id";

结果是:

但值“状态”不正确。最后插入的 unit_id(1) 值为 7000..

【讨论】:

    【解决方案2】:

    好的。让我们像这样尝试。

    WITH ranked_state AS (
      SELECT us.*, ROW_NUMBER() OVER (PARTITION BY unit_id ORDER BY date DESC) AS rn
      FROM propertyUnitEnergyStates us
      WHERE us.type = '$name' AND us.property_id = $propertyID
    )
    SELECT ranked_state.id, 
           ranked_state.property_id, 
           ranked_state.unit_id, 
           ranked_state.type, 
           ranked_state.state, 
           ranked_state.date, 
           pu.visible 
    FROM ranked_state 
    LEFT JOIN propertyUnits pu
    ON ranked_state.property_id = pu.property_id AND pu.visible = 1
    WHERE rn = 1 
    

    如果我解释这个查询.. 首先,关于满足给定条件的行(例如:us.type="$name", us.property_id=$propertyID),具有相同unit_id 的行是ordered by date。 然后做 LEFT JOIN。

    【讨论】:

    • 看起来不错,但我不能在我的 mariaDB 中使用 WITH .. 我正在使用 Ver 10.3.27 MariaDB
    • 您的数据库版本是多少?这将从 10.2.1 开始工作
    • 我明白了。现在它工作了,但每次启动后它都会返回奇怪的值。值总是不同的,它似乎忽略了属性 ID
    • 嗯..我无法准确解释为什么它返回一个奇怪的值,因为我无法测试它,但我试图让你参考这个逻辑。
    猜你喜欢
    • 1970-01-01
    • 2015-06-21
    • 2023-01-13
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多