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
)
您可以使用以下查询:
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条记录是基于这个假设推导出来的。
我在这里想要的是检索具有这些条件的 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
)
您可以使用以下查询:
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条记录是基于这个假设推导出来的。