Я получаю ошибку целого числа, но не понимаю почему.

Предупреждение: # 1292 Усеченное неверное значение INTEGER: '% accept%';

Предупреждение: # 1292 Усеченное неверное значение INTEGER: "% pending%".

Ошибка обработки отсутствует. Неважно, что находится в «1-й позиции», ошибки нет.

Может кто-нибудь помочь?

SELECT a.`post_id`, b.`name`,
       MAX(case when meta_key = 'value' THEN `meta_value` ELSE NULL END) as  'Email',
FROM table_1 a

INNER JOIN table_2 b
ON FIND_IN_SET(a.post_id, b.payment_ids)
GROUP BY a.post_id
HAVING OrderStatus LIKE '%processing%' OR '%pending%' OR '%accepted%' AND DeliveryDate >= (DATE_SUB(CURDATE(), INTERVAL 7 DAY)) AND DeliveryType = 'pickup'
0
Tim 17 Авг 2020 в 23:36

2 ответа

Лучший ответ
SELECT a.`post_id`, b.`name`,
       MAX(case when meta_key = 'value' THEN `meta_value` ELSE NULL END) as  'Email',
FROM table_1 a

INNER JOIN table_2 b
ON FIND_IN_SET(a.post_id, b.payment_ids)
GROUP BY a.post_id
HAVING OrderStatus LIKE '%processing%' OR OrderStatus LIKE '%pending%' OR OrderStatus LIKE '%accepted%' AND DeliveryDate >= (DATE_SUB(CURDATE(), INTERVAL 7 DAY)) AND DeliveryType = 'pickup'
0
Tim 17 Авг 2020 в 20:43

OrderStatus LIKE '%processing%' OR '%pending%' OR '%accepted%'

Это не то, что вы думаете. MySQL понимает это как:

(OrderStatus LIKE '%processing%')
OR ('%pending%')
OR ('%accepted%')

Поэтому он пытается оценить строки в логическом контексте, что выдает предупреждение, которое вы получаете.

Вам нужно повторить выражение like для каждой совпадающей строки:

(
    OrderStatus LIKE '%processing%' 
    OR OrderStatus LIKE '%pending%' 
    OR OrderStatus LIKE '%accepted%'
)

Или вы можете использовать регулярное выражение:

OrderStatus RLIKE 'processing|pending|accepted'

Обратите внимание, что эти условия должны принадлежать предложению where, а не предложению having, поскольку они относятся к неагрегированным столбцам. Я бы сформулировал запрос так:

select
    t1.post_id,
    t2.name,
    -- no need for an "else" branch here
    max(case when meta_key = 'value' then meta_value end) as email 
from table_1 t1
inner join table_2 t2 on find_in_set(t1.post_id, t2.payment_ids)
where
-- filtering in the "where" clause
    OrderStatus rlike 'processing|pending|accepted'    -- regex
    and DeliveryDate >= current_date - interval 7 day  -- no need for "datesub()"
    and DeliveryType = 'pickup'
group by 
-- all non-aggregated column in the `group by` clause    
    t1.post_id, 
    t2.name  

Обратите внимание, что перед всеми столбцами в запросе следует указывать таблицу, к которой они принадлежат, чтобы код был однозначным и не требующим пояснений.

1
GMB 17 Авг 2020 в 20:48