1

トランザクション レコードを含むデータベースがあります。各レコードはトランザクションのチェーンに属しており、これらは共有する TCID (トランザクション チェーン ID) を持っています。各トランザクションには、送信者と受信者が含まれています。私がする必要があるのは、チェーンの最終受信ユーザーが別のチェーンの最初の送信者と同じかどうかを確認することです。

現在、私の MySQL クエリは、最後の受信者が最初のトランザクションだけでなく、別のチェーンのトランザクションにあるレコードを返します。これを最終受信者と最初の送信者に厳密に制限する必要があります。

group by、order by、および limit 1 を使用してみましたが、これらはクエリがいくつかのレコードを見つけた後に適用されます。これまでに試したクエリは次のとおりです。

SELECT TCID FROM transactions WHERE senderUID = '$receiverUID' GROUP BY TCID LIMIT 1

グループ (TCID) 内の最初の (最も低い TID) レコードの送信者 UID のみを検索できる方法を知っている人はいますか?

ご協力いただきありがとうございます!

4

1 に答える 1

1

これで正しい方向に進むはずです-

//Gets rows where senderUID is the first (lowest TID) record in group
SELECT a.* 
FROM test a 
WHERE a.senderUID = '$receiverUID'
AND NOT EXISTS (select * from test where TCID = a.TCID and id < a.id and senderUID != '$receiverUID')
GROUP BY TCID

UNION

//Gets rows where senderUID is the same as the last receiverUID of TCID
SELECT b.* 
FROM test b
WHERE b.receiverUID = '$receiverUID'
AND NOT EXISTS (select * from test where TCID = b.TCID and id > b.id and receiverUID != '$receiverUID')
GROUP BY TCID

簡単な例として、次の表があります-

テーブルデータ

したがって、$receiverUID = 1 を設定すると、senderUID が TCID グループの最初の行 (1,9) である 2 行と、その送信者 UID が TCID グループの receiverUID である行 (4,7,8) が 3 行取得されます。

1としてのsenderUID/receiverUIDのTCIDグループ

LIMIT 1また、senderUID が TCID グループ (1)/(4,7,8) の最初である 1 行のみを取得する場合は、a を追加できます。

SELECT a.* 
FROM test a 
WHERE a.senderUID = '$receiverUID'
AND NOT EXISTS (select * from test where TCID = a.TCID and id < a.id and senderUID != '$receiverUID')
GROUP BY TCID LIMIT 1

senderUID/receiverUID の TCID グループを 1 として、最初の行の senderUID のみを制限します

$receiverUID = 2 (3,11)/(6,10) を設定した場合と同じ考え

2 としての送信者 UID/受信者 UID の TCID グループ

そしてLIMIT 1(3)/(6,10)で

senderUID/receiverUID の TCID グループを 2 として、最初の行の senderUID のみを制限します

于 2012-09-18T06:39:51.150 に答える