为了账号安全,请及时绑定邮箱和手机立即绑定

根据PHP中第一列的值检测其他列的变化

根据PHP中第一列的值检测其他列的变化

PHP
MYYA 2022-06-11 18:19:35
transaction_id   vendor_id    currency     1101           201          USD     1102           202          EUR     1103           203          CHF     1104           202          EUR     1105           204          HUF     *1106          202          USD     *1107          204          USD我有一个包含三列的表,并且有最后两个交易(1106 和 1107)的交易列表,其中vendor_idof202和204之前的默认货币分别为 EUR 和 HUF。然而,在最后一笔交易中,这两个供应商在他们最后的记录中使用了错误的货币。首选的结果是用错误的货币打印这两个交易。如何检测错误的货币并在 PHP 中打印这些交易(表来自数据库 MySQL,表名是table_transaction)?
查看完整描述

1 回答

?
江户川乱折腾

TA贡献1851条经验 获得超5个赞

考虑以下...


DROP TABLE IF EXISTS my_table;


CREATE TABLE my_table

(transaction_id SERIAL PRIMARY KEY

,vendor_id INT NOT NULL

,currency CHAR(3) NOT NULL

);


INSERT INTO my_table VALUES

(1101,201,'USD'),

(1102,202,'EUR'),

(1103,203,'CHF'),

(1104,202,'EUR'),

(1105,204,'HUF'),

(1106,202,'USD'),

(1107,204,'USD');


SELECT a.* 

  FROM my_table a

  LEFT 

  JOIN 

     ( SELECT x.*

         FROM my_table x 

         JOIN

            ( SELECT MIN(transaction_id) transaction_id 

                FROM my_table 

               GROUP 

                  BY vendor_id

            ) y

           ON y.transaction_id = x.transaction_id

     ) b 

    ON b.vendor_id = a.vendor_id 

   AND b.currency = a.currency

 WHERE b.transaction_id IS NULL;


 +----------------+-----------+----------+

 | transaction_id | vendor_id | currency |

 +----------------+-----------+----------+

 |           1106 |       202 | USD      |

 |           1107 |       204 | USD      |

 +----------------+-----------+----------+ 

要了解这里发生了什么,只需将查询分解为其组成部分并添加b.transaction_id到 SELECT...


离开'y'


SELECT MIN(transaction_id) transaction_id 

  FROM my_table 

 GROUP 

    BY vendor_id

该位获取每个供应商的第一个 transaction_id。这是有效的,因为 transaction_id 是 PRIMARY KEY。


然后我们将此结果连接回源表,以获取与该 transaction_id 对应的其他列(具体currency而言,在这种情况下):


   SELECT x.*

     FROM my_table x 

     JOIN

        ( SELECT MIN(transaction_id) transaction_id 

            FROM my_table 

           GROUP 

              BY vendor_id

        ) y

       ON y.transaction_id = x.transaction_id

最后,我们再次将上述所有内容进行 OUTER JOIN 回表,以获取不满足条件的行 ( b.vendor_id = a.vendor_id AND b.currency = a.currency WHERE b.transaction_id IS NULL)。


SELECT a.* 

     , b.transaction_id

  FROM my_table a

  LEFT 

  JOIN 

     ( SELECT x.*

         FROM my_table x 

         JOIN

            ( SELECT MIN(transaction_id) transaction_id 

                FROM my_table 

               GROUP 

                  BY vendor_id

            ) y

           ON y.transaction_id = x.transaction_id

     ) b 

    ON b.vendor_id = a.vendor_id 

   AND b.currency = a.currency;


+----------------+-----------+----------+----------------+

| transaction_id | vendor_id | currency | transaction_id |

+----------------+-----------+----------+----------------+

|           1101 |       201 | USD      |           1101 |

|           1102 |       202 | EUR      |           1102 |

|           1103 |       203 | CHF      |           1103 |

|           1104 |       202 | EUR      |           1102 |

|           1105 |       204 | HUF      |           1105 |

|           1106 |       202 | USD      |           NULL | <-- We only  want

|           1107 |       204 | USD      |           NULL | <-- these 'NULL' rows

+----------------+-----------+----------+----------------+


查看完整回答
反对 回复 2022-06-11
  • 1 回答
  • 0 关注
  • 103 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信