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