Прошу помощи, или в каком направлении смотреть. Есть таблица с результатами проверки беременности у животных id | femaleId | isSuccessful | ---+---------+------------+--------------------- 25 | 5 | t 26 | 5 | f 27 | 5 | f 28 | 3 | f 29 | 3 | t 29 | 3 | f Необходимо выбрать отрицательные значения(isSuccessful =f) у самок (femaleId) котроые идут подряд 2 и больше раз, сортировка идет по id . Т.е если у одной самки f 2 раза подряд то это знацение подходит В данном случае результат выборки должен выглядить как: | femaleId | isSuccessful | countsFailResult | ---------+------------+--------------------- | 5 | f | 2 Если у тойже самой самки f 4 раза после 2 то выбрать те значения которые повторяються чаще. Например id | femaleId | isSuccessful ---+---------+------------+--------------------- 25 | 5 | t 26 | 5 | f 27 | 5 | f 28 | 3 | f 29 | 3 | t 30 | 3 | f 31 | 5 | f 32 | 5 | f 33 | 5 | f 34| 5 | f Получим id | femaleId | isSuccessful | countsFailResult | ---+---------+------------+--------------------- 25 | 5 | f | 4 Подскажите возможно ли такое реализовать? Или какие вообще есть мысли. Уже 2 сутки голову ломаю, очень интересно. Сейчас беру просто запрос с положительными и отрицательными значениями и обрабатываю на php но хотелось не тянуть лишнее, и все через запрос сделать. Заранее спасибо! Буду очень признателен за помощь
я вот тоже так подумал сразу... а когда это прочитал теперь даже не знаю можно ли средствами MYSQL такое сделать.. group by все сразу сгруппирует..
можно выбрать тех, кто 2 потом выбрать тех кто 4 потом выбрать тех, у кого дата первого или последнего 4 после даты из тех, кто 2 в принципе это можно сделать в базе, и конечно же это можно сделать и в пхп но можно действительно изначально думать про такие морочки и придумать какие-то хитрости со структурой, чтобы проще считалось. навскидку можно в другую таблицу при отрицательном результате добавлять запись где будет число 0, а при положительном +1 к последней. Тогда можно будет легко выбирать у кого подряд сколько.
Ну я тоже конечно так пробывал, но как выбрать 2 подряд, а потом 4 подряд? Я знаю что в postgres да и вообще в базах данных нет такого понятия как следующая запись, и если мы сгрупируем то сгрупируеться все записи, и те что не рядом. единственное что на уме это пронумеровать а потом как то сравнивать типо если номер следующей записи и id животного и рез отрицательный совпадают то запись подходит, если нет то нет и выбрать примерно Код (Text): WITH SearchPregnancyCheck (INTEGER) AS ( SELECT CAST ( "animals"."id" AS INTEGER ), "animals"."femaleId", "AnimalsPregnancyCheckData"."isSuccessful" FROM "AnimalJournal" INNER JOIN "AnimalsPregnancyCheckData" ON "AnimalsPregnancyCheckData"."animalId" = "Animal"."id" WHERE "Animal"."organizationId" = 1 AND ( "Animal"."statusId" = 10 OR "Animal"."statusId" = 15 ) ), GroupAnimalPregnancyCheck AS ( SELECT *, ROW_NUMBER () OVER (ORDER BY INTEGER) AS "num", 1 + ROW_NUMBER () OVER (ORDER BY INTEGER) AS "nextNum" FROM SearchAnimalPregnancyCheck ) SELECT * FROM SearchPregnancyCheck но естественно составить запрос не получаеться, ли бо рекурсийе Код (Text): WITH RECURSIVE SearchAnimalPregnancyCheck (x) AS ( SELECT CAST ( "Animal"."id" AS INTEGER ), "Animal"."femaleId", "AnimalPregnancyCheckData"."isSuccessful" FROM "Animal" INNER JOIN "AnimalPregnancyCheckData" ON "AnimalPregnancyCheckData"."journalId" = "Animal"."id" WHERE "Animal"."organizationId" = 1 AND ( "Animal"."statusId" = 10 OR "Animal"."statusId" = 15 ) UNION ALL SELECT * FROM SearchAnimalPregnancyCheck ) SELECT * FROM SearchAnimalPregnancyCheck тоже примерно, и там выбирать, но не выходит, вот и интересно мне терпения не хватает или это вообще не выполнимо теми методами которые я пробую, тупо order by и groub by c having тут не подойдут, потому что подряд нужны записи.
Пересчитывайте в отдельную агрегрирщую таблицу данные по триггеру добавления записи в текущую и не мучайтесь. Столько времени на решение одной задачи на структуре для нее не предназначенной тратить преступно
Так мне выборку сделать надо а тригеры - Триггеры срабатывают при выполнении с таблицей команды SQL INSERT, UPDATEили DELETE. т.е. как я понял перебераю записи если запись подходит то записываю в агрегрирщую таблицу, только как я пойму, что запись подходит и что они идут по пярядку, и что следующая запись мне подходит?
пишешь следующую строку, если последняя строка соответствует твоим фильтрам для записываемой строки, то увеличиваешь счетчик в агрегаторе по этим же фильтрам ("значения подряд" или что у вас там).