php - 如何构建一个查询,通过交易历史提取用户当前拥有的所有合约

标签 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` 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来防止输出重复。 ORDER BY 是可选的。

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

您的 recipient_id 索引将有助于此查询。

关于php - 如何构建一个查询,通过交易历史提取用户当前拥有的所有合约,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54281835/

相关文章:

php - 在 codeigniter 中插入语句

sql - 有没有人注意到 EF Core 1.0 2015.1 使查询效率非常低

mysql - 为什么它包含 "Using where"?

python - 查找、解码并替换文本文件中的所有 Base64 值

javascript - Laravel 4-重定向到 JavaScript 代码 Blade 模板中的路由

php - Laravel 5.6 如何逐行读取文本文件

php - 有没有办法通过Onclick功能从MOzilla强制打开一个新的浏览器窗口到IE?

php - 显示评论表mysql中的多个值?

php - 如何使用 mysql 语法(如 if 条件)使用 codeigniter 表更新?

php - 无法在数据库中创建表