如何使用左连接mysql从表2中获取最后一行

如何使用左连接mysql从表2中获取最后一行,mysql,Mysql,我有两个表tbl\u product\u checkout和tbl\u product\u checkout\u status,其中我想从tbl\u product\u checkout\u status //tbl_product_checkout product_checkout_id user_id product_checkout_order_no -----------------------------------------------------------

我有两个表
tbl\u product\u checkout
tbl\u product\u checkout\u status
,其中我想从
tbl\u product\u checkout\u status

//tbl_product_checkout

product_checkout_id    user_id    product_checkout_order_no
-----------------------------------------------------------
        1                 1              ORD123456


//tbl_product_checkout_status

checkout_status_id    product_checkout_id    checkout_status_check
------------------------------------------------------------------
        1                      1                  Dispatched
        2                      1                  Delivered
我已尝试使用以下查询

SELECT * 
  FROM tbl_product_checkout pc 
  LEFT 
  JOIN tbl_product_checkout_status cs 
    ON cs.product_checkout_id = pc.product_checkout_id  
 WHERE pc.user_id = 1 
 GROUP 
    BY pc.product_checkout_id 
 ORDER 
    BY cs.checkout_status_id DESC
但是上面查询的输出是

user_id    product_checkout_order_no    checkout_status_check
-------------------------------------------------------------
   1              ORD123456                  Dispatched
但我希望结果是

user_id    product_checkout_order_no    checkout_status_check
-------------------------------------------------------------
   1              ORD123456                  Delivered

我认为你的团队会把你想要的结果搞砸。我对您给定的数据库模式进行了研究,并做了一些修改,最终得到了您想要的结果。因此,您的sql应该是这样的:

SELECT * FROM tbl_product_checkout as pc 
LEFT JOIN tbl_product_checkout_status as cs ON 
cs.product_checkout_id = pc.product_checkout_id 
WHERE pc.user_id = 1 ORDER BY cs.checkout_status_id DESC limit 1
通过使用限制1,您将获得我们按DESC订购的最后一行

请记住,我删除了日期部分,因为示例代码中没有日期


我认为你的团队会把你想要的结果搞砸。我对您给定的数据库模式进行了研究,并做了一些修改,最终得到了您想要的结果。因此,您的sql应该是这样的:

SELECT * FROM tbl_product_checkout as pc 
LEFT JOIN tbl_product_checkout_status as cs ON 
cs.product_checkout_id = pc.product_checkout_id 
WHERE pc.user_id = 1 ORDER BY cs.checkout_status_id DESC limit 1
通过使用限制1,您将获得我们按DESC订购的最后一行

请记住,我删除了日期部分,因为示例代码中没有日期


添加一个where=max子查询,例如

DROP TABLE IF EXISTS tbl_product_checkout,tbl_product_checkout_status;

CREATE TABLE tbl_product_checkout(product_checkout_id INT,   user_id INT,   product_checkout_order_no VARCHAR(20));
INSERT INTO tbl_product_checkout VALUES
(        1       ,          1  ,            'ORD123456');


CREATE TABLE tbl_product_checkout_status(checkout_status_id INT,   product_checkout_id INT,    checkout_status_check VARCHAR(20));
INSERT INTO tbl_product_checkout_status VALUES
(        1      ,                1 ,                 'Dispatched'),
(        2      ,                1 ,                 'Delivered');

SELECT * FROM
tbl_product_checkout T1
LEFT JOIN tbl_product_checkout_status T2 ON T1.PRODUCT_CHECKOUT_ID = T2.PRODUCT_CHECKOUT_ID
WHERE T2.CHECKOUT_STATUS_ID = (
SELECT MAX(T3.CHECKOUT_STATUS_ID) 
FROM tbl_product_checkout_status T3 
WHERE T3.PRODUCT_CHECKOUT_ID = T2.PRODUCT_CHECKOUT_ID
)
;
结果

+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
| product_checkout_id | user_id | product_checkout_order_no | checkout_status_id | product_checkout_id | checkout_status_check |
+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
|                   1 |       1 | ORD123456                 |                  2 |                   1 | Delivered             |
+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
1 row in set (0.00 sec)

添加where=max子查询,例如

DROP TABLE IF EXISTS tbl_product_checkout,tbl_product_checkout_status;

CREATE TABLE tbl_product_checkout(product_checkout_id INT,   user_id INT,   product_checkout_order_no VARCHAR(20));
INSERT INTO tbl_product_checkout VALUES
(        1       ,          1  ,            'ORD123456');


CREATE TABLE tbl_product_checkout_status(checkout_status_id INT,   product_checkout_id INT,    checkout_status_check VARCHAR(20));
INSERT INTO tbl_product_checkout_status VALUES
(        1      ,                1 ,                 'Dispatched'),
(        2      ,                1 ,                 'Delivered');

SELECT * FROM
tbl_product_checkout T1
LEFT JOIN tbl_product_checkout_status T2 ON T1.PRODUCT_CHECKOUT_ID = T2.PRODUCT_CHECKOUT_ID
WHERE T2.CHECKOUT_STATUS_ID = (
SELECT MAX(T3.CHECKOUT_STATUS_ID) 
FROM tbl_product_checkout_status T3 
WHERE T3.PRODUCT_CHECKOUT_ID = T2.PRODUCT_CHECKOUT_ID
)
;
结果

+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
| product_checkout_id | user_id | product_checkout_order_no | checkout_status_id | product_checkout_id | checkout_status_check |
+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
|                   1 |       1 | ORD123456                 |                  2 |                   1 | Delivered             |
+---------------------+---------+---------------------------+--------------------+---------------------+-----------------------+
1 row in set (0.00 sec)

表中是否有自动递增字段tables@MHRasel对
product\u checkout\u id
checkout\u status\u id
然后使用max()获取最后一行如果仅禁用了“完全”GROUP\u GROUP\u BY,则GROUP BY的标准SQL用法的MySQL扩展允许选择列表,条件是,或按列表排序以引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此,除非它们相同,否则选择的值是不确定的,这可能不是您想要的。@MHRasel如何使用
max()
中是否有任何自动递增字段tables@MHRasel对
product\u checkout\u id
checkout\u status\u id
然后使用max()获取最后一行如果仅禁用了“完全”GROUP\u GROUP\u BY,则GROUP BY的标准SQL用法的MySQL扩展允许选择列表,条件是,或按列表排序以引用未聚合的列,即使这些列在功能上不依赖于GROUP BY列。这导致MySQL接受前面的查询。在这种情况下,服务器可以从每个组中自由选择任何值,因此除非它们相同,否则选择的值是不确定的,这可能不是您想要的。@MHRasel如何使用
max()
不要使用
LIMIT
不要使用
LIMIT