mysql - 如何过滤 MySQL 结果以在每个用户的基础上显示 LIMIT 1?

标签 mysql sql filter greatest-n-per-group

这是 SQL 命令结果的屏幕截图:

enter image description here

这是SQL命令:

SELECT inl_cbsubs_subscriptions.user_id AS cbsubsUserID, inl_cbsubs_subscriptions.id AS cbsubsId, inl_cbsubs_subscriptions.status AS status, inl_cbsubs_payment_items.subscription_id     AS paymentSubID, inl_cbsubs_payment_items.stop_date AS paymentStopDate, inl_cbsubs_payment_items.id AS paymentID
FROM inl_cbsubs_subscriptions
INNER JOIN inl_cbsubs_payment_items
ON inl_cbsubs_subscriptions.id=inl_cbsubs_payment_items.subscription_id
WHERE status='C'
ORDER BY paymentID DESC;

我希望调整此命令,以便我只显示每个用户的最新结果。所以换句话说,在这种情况下,表格应该类似于:

enter image description here

如您所见,cbsubsUserID 每个 ID 仅显示一个结果,而之前 596 id 有多个结果。

最佳答案

如果你想要最新的结果,最好的方法是使用not exists:

SELECT s.user_id AS cbsubsUserID, s.id AS cbsubsId, s.status AS status,
       i.subscription_id AS paymentSubID, i.stop_date AS paymentStopDate, i.id AS paymentID
FROM inl_cbsubs_subscriptions s INNER JOIN
     inl_cbsubs_payment_items i
     ON s.id = i.subscription_id
WHERE s.status = 'C' and
      not exists (select 1
                  from inl_cbsubs_payment_items i2
                  where i2.subscription_id = i.subscription_id and
                    i2.id > i.id
                 )
ORDER BY paymentID DESC;

您需要在 inl_cbsubs_payment_items(subscription_id, paymentid) 上建立索引。

这句话的意思是:“为我提供给定订阅 ID 的所有项目,这些项目没有更大的订阅付款停止日期”。这是一种奇特的说法,“给我每个订阅 ID 的最新信息”,但它往往在数据库中最有效。

关于mysql - 如何过滤 MySQL 结果以在每个用户的基础上显示 LIMIT 1?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593248/

相关文章:

c# - ElasticSearch 和 Nest 过滤不起作用

mysql - 在 MySQL 中,如何选择第一次出现在多个列中的数字?

MYSQL 等效于 MS-Access 函数 first() last()

mysql - 如何更新多对多表: delete, 全部删除,插入,重新插入

sql - 试图过滤别名列中的空值 - postgresql?

python - 在 python 3 中应用 python 2 代码时遇到问题

java - 使用 MySQL 读取 Netflow 数据包内容

php - 如何使用 PHP 将日期传递给 MySQL

php - 使用 WHERE 1=1 AND 构建 SQL 查询是不好的做法吗

javascript - 按元素名称过滤表