Mysql запрос получить данные, если определенный столбец в последовательности

Я хочу получить pid, которые имеют следующие критерии:
pid количество не менее 3 и 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.sidattendance_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-кодирования? Помоги мне, пожалуйста.

2

Решение

Вы можете разделить два условия на два отдельных подзапроса и просто выбрать строки с pids, которые существуют в обоих наборах;

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
)

Образец IDEone для тестирования.

2

Другие решения

Вы можете использовать следующий запрос:

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 определяет порядок в вашей таблице. последовательный Табличные записи выводятся на основании этого предположения.

2

По вопросам рекламы [email protected]