Я хочу получить 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-кодирования? Помоги мне, пожалуйста.
Вы можете разделить два условия на два отдельных подзапроса и просто выбрать строки с 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
)
Вы можете использовать следующий запрос:
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
определяет порядок в вашей таблице. последовательный Табличные записи выводятся на основании этого предположения.