Php 如何构建一个查询,通过事务历史记录提取用户拥有的所有当前合同

Php 如何构建一个查询,通过事务历史记录提取用户拥有的所有当前合同,php,mysql,sql,Php,Mysql,Sql,我正在设置一个脚本,需要通过事务历史提取用户拥有的所有当前合同 以下是事务表和一些测试数据: CREATE TABLE `transaction` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, `sender_id` int(11) NOT NULL, `recipient_id` int(11) NOT NULL, `contract_id` int(11) NOT NULL, `created_on` dateti

我正在设置一个脚本,需要通过事务历史提取用户拥有的所有当前合同

以下是事务表和一些测试数据:

CREATE TABLE `transaction` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `sender_id` int(11) NOT NULL,
  `recipient_id` int(11) NOT NULL,
  `contract_id` int(11) NOT NULL,
  `created_on` datetime NOT NULL,
  PRIMARY KEY (`id`),
  KEY `sender_id` (`sender_id`,`contract_id`,`tokens`),
  KEY `recipient_id` (`recipient_id`,`contract_id`,`tokens`)
);

INSERT INTO `transaction` VALUES 
(1,10,20,1,'2019-01-20 15:41:47'),
(2,10,20,2,'2019-01-20 15:41:47'),
(3,30,10,1,'2019-01-20 15:41:47'),
(4,30,10,3,'2019-01-20 15:41:47'),
(5,20,10,2,'2019-01-20 15:41:47');
作为输出,我想要一个数组,其中包含给定用户的所有合同id

用户id=10的查询输出:

+-------------+
| contract_id |
+-------------+
|           1 |
+-------------+
|           2 |
+-------------+
|           3 |
+-------------+
这是我必须实现的当前代码。不过,如果是一个查询就好了

$query = 'SELECT DISTINCT contract_id
    FROM transaction
    WHERE tokens IS NULL
    ORDER BY created_on DESC';

$statement = $this->entityManager
    ->getConnection()
    ->prepare($query);

$statement->execute();

$contracts = [];

foreach ($statement->fetchAll() as $row) {
    $query = 'SELECT *
        FROM transaction
        WHERE contract_id = :contract
        AND tokens IS NULL
        ORDER BY created_on DESC';

    $statement = $this->entityManager
        ->getConnection()
        ->prepare($query);

    $statement->execute([
        'contract' => $row['contract_id']
    ]);

    $result = $statement->fetch();

    if ((int) $result['recipient_id'] !== $user->getId()) {
        continue;
    }

    $contracts[] = $result['contract_id'];
}

return $contracts;

取尽可能少的答案,使用
DISTINCT
以防止输出中出现重复<代码>订购依据是可选的

SELECT DISTINCT contract_id
FROM transactions
WHERE recipient_id = :id
ORDER BY contract_id

您的
recipient\u id
索引将有助于此查询。

获取尽可能少的答案,使用
DISTINCT
以防止输出中出现重复<代码>订购依据是可选的

SELECT DISTINCT contract_id
FROM transactions
WHERE recipient_id = :id
ORDER BY contract_id

您的
收件人\u id
索引将有助于此查询。

首先,您没有根据数据库字段提供有关合同所有者的信息。无法判断它是发件人id还是收件人id。您的问题也有点模糊,因为我无法确定您是否需要基于数据的多个关联数组

SELECT contract_id
FROM transactions
WHERE sender_id = ?
GROUP BY contract_id, created_on DESC

请记住转义您的输入值。

首先,您没有根据数据库字段提供有关合同所有者的信息。无法判断它是发件人id还是收件人id。您的问题也有点模糊,因为我无法确定您是否需要基于数据的多个关联数组

SELECT contract_id
FROM transactions
WHERE sender_id = ?
GROUP BY contract_id, created_on DESC

请记住避开您的输入值。

您的困难到底是什么?到目前为止,你尝试了什么?你在哪里卡住了?我的发送者id和接收者id部分有问题。我必须创建一个跟踪发送者和接收者的查询,以确定谁拥有某个或多个合同。我尝试过使用交叉连接,但这就是我的目的。可能是错误的测试数据,因为您只有合同id 1。。此外,您应该提供文本格式的例外结果,以便我们验证我们的查询。我已更新了测试数据并提供了文本格式的结果。因此,用户id与
收件人id
发件人id
或两者匹配?您到底有什么困难?到目前为止,你尝试了什么?你在哪里卡住了?我的发送者id和接收者id部分有问题。我必须创建一个跟踪发送者和接收者的查询,以确定谁拥有某个或多个合同。我尝试过使用交叉连接,但这就是我的目的。可能是错误的测试数据,因为您只有合同id 1。。此外,您应该提供文本格式的例外结果,以便我们验证我们的查询。我已更新了测试数据并提供了文本格式的结果。因此,用户id与
收件人id
发件人id
或两者匹配?我已使用代码更改了描述以实现此目的。也许这可以更好地解释它应该做什么。我用我为实现这一点而编写的代码更改了描述。也许这能更好地解释它应该做什么。