Условие в mysql

#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