MySQL 查询根据条件限制查找行重复项

标签 mysql duplicates limit conditional-statements rows

我有两个表:

Members:

id     username    


Trips:

id    member_id     flag_status         created
                  ("YES" or "NO")

我可以这样查询:

SELECT 
  Trip.id, Trip.member_id, Trip.flag_status
FROM  
  trips Trip
WHERE   
  Trip.member_id = 1711
ORDER BY
  Trip.created DESC
LIMIT
  3

哪个可以给出这样的结果:

id       member_id     flag_status
8        1711          YES
9        1711          YES
10       1711          YES

我的目标是知道该成员的最后三个行程是否都有一个 flag_status = "YES",如果三个中的任何一个 != "YES",那么我不想让它计数。

我还希望能够删除 WHERE Trip.member_id = 1711 子句,并让它对我的所有成员运行,并提供最近 3 次旅行都具有 flag_status = "YES"的成员总数

有什么想法吗?

谢谢!

http://sqlfiddle.com/#!2/28b2d

在那个 sqlfiddle 中,当我正在寻找的正确查询运行时,我应该看到如下结果:

 COUNT(Member.id)
        2

应该符合条件的两个成员是成员 1 和 3。成员 5 失败了,因为他的一个行程有 flag_status = "NO"

最佳答案

您可以使用 GROUP_CONCAT 函数,获取按 id 升序排列的所有状态的列表:

SELECT
  member_id,
  GROUP_CONCAT(flag_status ORDER BY id DESC) as status
FROM
  trips
GROUP BY
  member_id
HAVING
  SUBSTRING_INDEX(status, ',', 3) NOT LIKE '%NO%'

然后使用 SUBSTRING_INDEX 您可以只提取最后三个状态标志,并排除那些包含 NO 的标志。请看 fiddle here .我假设您的所有行都按 ID 排序,但如果您有创建日期,则最好使用:

GROUP_CONCAT(flag_status ORDER BY created DESC) as status

正如雷蒙德建议的那样。然后,您还可以使用类似以下内容仅返回返回的行数:

SELECT COUNT(*)
FROM (
  ...the query above...
) as q

关于MySQL 查询根据条件限制查找行重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19877776/

相关文章:

php - 限制 Laravel 5 分页链接

java - 如何在 Java 中实现下载速率限制?

python - 如何合并大多数重复的行

java - 在Java中不使用Hashmap、HashSet等查找字符串中的重复单词

vim - 如何复制选区并将其放置在选区上方或下方

mysql - Navicat MySQL 查询列在连接两个表时为空(客户和订单表关系)

mysql - 使用 ORDER BY 和 LIMIT 时查询速度慢

mysql - 获取多个求和值的最大值

mysql - 连接 2 个不相等的 sql 查询

mysql - phpmyadmin 中的 MYSQL 触发器语法问题