Я пытаюсь просмотреть записи, используя запрос MySQL, имейте в виду, что этот процесс должен происходить в базе данных, поэтому я не могу использовать лучшую альтернативу, которая была бы Python.
Table_a
#animalid calvdate lactationid
animal_A 2015-06-12 1
animal_A 2017-06-10 2
animal_B 2018-08-10 1
Table_b
#animalid milkdate morningmilk midmilk eveningmilk
animal_A 2018-02-16 8 0 8
animal_A 2016-02-12 12 0 12
мой запрос
SELECT *, calvdate FROM Table_b
INNER JOIN Table_a ON Table_b.animalid = Table_a.animalid
WHERE TO_DAYS(milkdate) - TO_DAYS(calvdate)<400
GROUP BY Table_b.animalid and milkdate
вывод моего запроса
#animalid milkdate morningmilk midmilk eveningmilk calvdate
animal_A 2018-02-16 8 0 8 2015-06-12
Как я могу захватить все записи из table_b, которые укладываются в 400-дневный запас, не усекая правильные записи из table_b ожидаемый результат:
#animalid milkdate morningmilk midmilk eveningmilk calvdate
animal_A 2018-02-16 8 0 8 2015-06-12
animal_A 2017-02-12 12 0 12 2017-06-10
Чего должна достичь эта группа. И можете ли вы добавить ожидаемый результат, пожалуйста.
group by должна избавиться от дубликатов
Это не очень хорошее использование группы, вместо этого используйте отдельные и прочитайте dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
Обратите внимание, что WHERE TO_DAYS(milkdate) - TO_DAYS(calvdate)<400
, вероятно, будет включать строки, которые вам не нужны, поскольку условие не учитывает ситуации, когда дата кальцификации стоит после даты молока.
Пожалуйста, используйте CREATE TABLE
и INSERT ... VALUES
для примера данных. (Желаемые результаты не обязательно представлять в виде примера кода, так как результаты являются выходными данными кода, а не самим кодом.)
AND
— оператор. Выражение Table_b.animalid and milkdate
приводит аргументы к логическим значениям и принимает логическую конъюнкцию (которая всегда будет равна 0). Следовательно, каждая строка в результате находится в одной группе, поэтому в результате вы видите только одну.
Чтобы сгруппировать по нескольким столбцам, используйте запятую:
GROUP BY Table_b.animalid, milkdate
Используйте запрос подвыборки, который вернет все записи из первой таблицы и подходящие значения из второй таблицы.
select animalid as testday_animalid, milkdate,
(select calvdate as calvdate from lactationmaster where animalid = testday_animalid and calvdate < milkdate order by calvdate desc limit 1) as calvdate
from view_testlact
order by milkdate;
Что вы имеете в виду под без усечения правильных записей из table_b