Mysql 如果某列在序列中则查询获取数据

Mysql query get data if certain column is on sequence

我在这里想要的是检索具有这些条件的 pid: pid 计数至少为 3,sid 至少应包含两个按顺序排列的数字。例如 sid 应该是 1 & 2、2 & 3、3 & 4 等等。

Table sem_attendance
attendance_id   sid    pid
            1     1      3
            6     1     12 
            8     2     12 
            9     4     12 
           10     1     23 
           11     3     23 
           12     1     29 
           13     3     27  
           14     2     24 
           15     3     21 
           16     2     21 
           17     1     27 
           18     2     27
           19     5     23

我的查询:

SELECT attendance_id, sid, sem_attendance.pid
FROM sem_attendance
INNER JOIN (
    SELECT pid
    FROM sem_attendance
    GROUP BY pid HAVING COUNT( pid ) =3)
temp ON sem_attendance.pid = temp.pid
ORDER BY temp.pid, sem_attendance.sid


attendance_id   sid    pid  
            6     1     12
            8     2     12
            9     4     12
           10     1     23
           11     3     23
           19     5     23
           17     1     27
           18     2     27
           13     3     27

期望的输出应该只是pid 的12 和27,因为sid 的1、3 和5 没有顺序。是否可以在 mysql 上执行此操作?如果没有,php 编码怎么样?请帮助我。

您可以将这两个条件拆分为两个单独的子查询,并只选择具有两个集合中都存在的 pid 的行;

SELECT * FROM sem_attendance
WHERE pid IN (                           -- at least 3 in the group
  SELECT pid FROM sem_attendance
  GROUP BY pid HAVING COUNT(1) >= 3
)
AND pid IN (                             -- at least 2 consecutive
  SELECT a.pid FROM sem_attendance a JOIN sem_attendance b
    ON a.pid = b.pid AND a.sid = b.sid + 1
)

An IDEone sample to test with.

您可以使用以下查询:

SELECT attendance_id, sid, pid 
FROM (
  SELECT attendance_id, sid, pid, 
         (SELECT sid
          FROM sem_attendance AS t2
          WHERE t1.pid = t2.pid AND t1.attendance_id < t2.attendance_id
          ORDER BY attendance_id LIMIT 1) AS next_sid
  FROM sem_attendance AS t1
  WHERE pid IN (SELECT pid
               FROM sem_attendance
               GROUP BY pid
               HAVING COUNT(*) >= 3)) AS t
WHERE sid = next_sid - 1       

我假设字段 attendance_id 定义了您的 table 中的顺序。 连续 table条记录是基于这个假设推导出来的。