#mysql
#mysql
Вопрос:
Я пытаюсь перебирать записи с помощью запроса 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
Комментарии:
1. Что вы имеете в виду, не обрезая правильные записи из table_b
2. Чего должна достичь эта группа by. И не могли бы вы добавить свой ожидаемый результат, пожалуйста.
3. предполагается, что group by избавляется от дубликатов
4. Это не очень хорошее использование group by вместо этого используйте distinct и читайте дальше dev.mysql.com/doc/refman/8.0/en/group-by-handling.html
5. Обратите внимание, что
WHERE TO_DAYS(milkdate) - TO_DAYS(calvdate)<400
это, вероятно, будет включать строки, которые вам не нужны, поскольку условие не учитывает ситуации, когда calvdate находится после milkdate .
Ответ №1:
Используйте вспомогательный запрос выбора, который вернет все записи из первой таблицы и значения, которые соответствуют второй таблице.
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;
Ответ №2:
AND
является оператором. Выражение Table_b.animalid and milkdate
преобразует аргументы в логические значения и принимает логическую конъюнкцию (которая всегда будет равна 0). Следовательно, каждая строка в результате находится в одной группе, поэтому вы видите только одну в результате.
Для группировки по нескольким столбцам используйте запятую:
GROUP BY Table_b.animalid, milkdate