duanchoupo1104 2019-04-11 19:17
浏览 287
已采纳

将子查询结果集限制为最后一条记录

I have four tables that are linked. The itemStatus table can have multiple records per Cart item to show its history (e.g. purchased, processed, shipped, delivered). The Shop table pulls in the Cart items name. The Order table defines all the Cart items in the order.

To show the latest status (not entire history) of each Cart item in the Order, I need to only obtain the last record for itemStatus. I am using a sub-query to obtain the records of the itemStatus table, but can not figure out how to get the last record. Playing with the below code, I end up always getting the first record:

SELECT
    tblOrders.id,tblOrders.status as orderStatus,tblOrders.created,tblCart.id AS cartID,tblCart.status AS cartStatus,tblCart.qty,tblCart.price,tblShop.title,tblItem.itemStatus 
FROM
    ".PREFIX."Orders tblOrders 
LEFT JOIN
    ".PREFIX."Cart tblCart ON tblOrders.id=tblCart.OID 
LEFT JOIN
    ".PREFIX."Shop tblShop ON tblCart.PID=tblShop.id 
LEFT JOIN
    (SELECT
        CID,status as itemStatus
    FROM
        ".PREFIX."ItemStatus
    WHERE
        status IN ('pending','refunded','cancelled','purchased','backordered','shipping','delivered')
GROUP BY CID
    ORDER BY
        created DESC
    ) tblItem ON tblCart.id=tblItem.CID 
WHERE
    tblOrders.status<>'disabled' AND tblCart.status='purchased' AND tblCart.BID='".$gbl_user['id']."' 
ORDER BY
    tblOrders.updated DESC

As shown above, I have tried using the 'GROUP BY' clause to limit the number of records returned by the sub-query, but that does not produce desired results. I have also tried placing a 'LIMIT 1' clause in the sub-query too, but that only limits the number of records returned to 1 (so any other cart items do not end up with a status). Any help would be appreciated!

UPDATE:

Per the duplication marking, I attempted to update the code using the MAX() statement and removal of 'ORDER BY' as follows:

SELECT
    tblOrders.id,tblOrders.status as orderStatus,tblOrders.created,tblCart.id AS cartID,tblCart.status AS cartStatus,tblCart.qty,tblCart.price,tblShop.title,tblItem.itemStatus 
FROM
    ".PREFIX."Orders tblOrders 
LEFT JOIN
    ".PREFIX."Cart tblCart ON tblOrders.id=tblCart.OID 
LEFT JOIN
    ".PREFIX."Shop tblShop ON tblCart.PID=tblShop.id 
LEFT JOIN
    (SELECT
        CID,status as itemStatus,MAX(created) as itemCreated
    FROM
        ".PREFIX."ItemStatus
    WHERE
        status IN ('pending','refunded','cancelled','purchased','backordered','shipping','delivered')
GROUP BY CID
    ) tblItem ON tblCart.id=tblItem.CID 
WHERE
    tblOrders.status<>'disabled' AND tblCart.status='purchased' AND tblCart.BID='".$gbl_user['id']."' 
ORDER BY
    tblOrders.updated DESC

UPDATE 2:

I had provided the actual code that works to solve the problem, but it wasn't approved for some reason. I am posting the correct code below:

SELECT
    tblOrders.id, tblOrders.status as orderStatus, tblOrders.created,
    tblCart.id AS cartID, tblCart.status AS cartStatus,tblCart.qty,
    tblCart.price, tblShop.title, tblItem.status as itemStatus 
FROM
    ".PREFIX."Orders tblOrders 
LEFT JOIN
    ".PREFIX."Cart tblCart ON tblOrders.id=tblCart.OID 
LEFT JOIN
    ".PREFIX."Shop tblShop ON tblCart.PID=tblShop.id 
LEFT JOIN
    ".PREFIX."ItemStatus tblItem ON tblCart.id=tblItem.CID 
JOIN (
    SELECT
        CID, MAX(created) AS maxCreated
    FROM
        ".PREFIX."ItemStatus
    WHERE
        status IN ('pending','refunded','cancelled','purchased','backordered','shipping','delivered')
    GROUP BY
        CID
) tblMaxItem ON tblItem.CID=tblMaxItem.CID AND tblItem.created=tblMaxItem.maxCreated
WHERE
    tblOrders.status<>'disabled' AND tblCart.status='purchased' AND tblCart.BID='".$gbl_user['id']."' 
ORDER BY
    tblOrders.updated DESC
  • 写回答

1条回答 默认 最新

  • dougou7782 2019-04-11 20:49
    关注

    You need to join with both ItemStatus and a subquery that gets the latest date for each item, so you can get other columns columns from that row.

    SELECT
        tblOrders.id, tblOrders.status as orderStatus, tblOrders.created,
        tblCart.id AS cartID, tblCart.status AS cartStatus,tblCart.qty,
        tblCart.price, tblShop.title, tblItem.status AS itemStatus
    FROM
        ".PREFIX."Orders tblOrders 
    LEFT JOIN
        ".PREFIX."Cart tblCart ON tblOrders.id=tblCart.OID 
    LEFT JOIN
        ".PREFIX."Shop tblShop ON tblCart.PID=tblShop.id 
    LEFT JOIN
        ".PREFIX."ItemStatus tblItem ON tblCart.id=tblItem.CID 
    LEFT JOIN (
        SELECT
            CID, MAX(created) AS maxCreated
        FROM
            ".PREFIX."ItemStatus
        WHERE
            status IN ('pending','refunded','cancelled','purchased','backordered','shipping','delivered')
        GROUP BY
            CID
    ) tblMaxItem ON tblItem.CID=tblMaxItem.CID AND tblItem.created=tblMaxItem.maxCreated
    WHERE
        tblOrders.status<>'disabled' AND tblCart.status='purchased' AND tblCart.BID='".$gbl_user['id']."' 
    ORDER BY
        tblOrders.updated DESC
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记