根据PHP中第一列的值检测其他列中的更改

根据PHP中第一列的值检测其他列中的更改,php,mysql,Php,Mysql,我有三列的表格,还有最后两笔交易的交易列表1106和1107,供应商id为202和204,之前的默认货币分别为欧元和匈牙利福林。但是,在上一笔交易中,这两个供应商的上一笔记录中的货币错误。首选结果是使用错误的货币打印这两个交易 如何检测错误的货币并在PHP中打印这些事务表来自数据库MySQL,表名为table_transaction?考虑以下几点 transaction_id vendor_id currency 1101 201 USD

我有三列的表格,还有最后两笔交易的交易列表1106和1107,供应商id为202和204,之前的默认货币分别为欧元和匈牙利福林。但是,在上一笔交易中,这两个供应商的上一笔记录中的货币错误。首选结果是使用错误的货币打印这两个交易


如何检测错误的货币并在PHP中打印这些事务表来自数据库MySQL,表名为table_transaction?

考虑以下几点

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
要理解这里发生了什么,只需将查询分解为其组成部分,并将b.transaction_id添加到SELECT

“y”部分

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      |
 +----------------+-----------+----------+ 
该位获取每个供应商的第一个事务id。这是因为事务id是主键

然后,我们将此结果连接回源表,以获取与该事务id对应的其他列,尤其是货币,在本例中:

SELECT MIN(transaction_id) transaction_id 
  FROM my_table 
 GROUP 
    BY vendor_id
最后,我们再次将上述所有内容连接到表中,以获取不满足条件b.vendor\u id=a.vendor\u id和b.currency=a.currency的行,其中b.transaction\u id为NULL


如果我们有1108203美元,我们怎么知道哪一行是“错误的”?通过供应商id,203列中的默认货币第一个值是瑞士法郎。因此给定供应商的第一个值总是正确的?是的,每个供应商id的第一个条目基本上是默认值。哇,这就是我正在寻找的,谢谢!无论如何,where子句是关键。你能详细说明一下吗?
   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
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
+----------------+-----------+----------+----------------+