Условие SQL, если не существует - PullRequest
0 голосов
/ 16 января 2019

, поэтому у меня есть этот запрос SQL:

SELECT 
    p.ID
FROM 
    `cdlr_posts` p, 
    cdlr_postmeta pm 
WHERE 
    pm.post_id=p.ID AND 
    `post_type` = 'shop_order' AND
    pm.meta_key = '_statusCDLR' AND
    pm.meta_value <> 1 
group by
    p.ID

Мне нужно показать все IDS, если они соответствуют этим условиям, но я также хотел бы показать те, которые не содержат "_statusCDLR" meta_key Я попытался что-то подобное без удачи:

WHERE 
    pm.post_id=p.ID AND 
    `post_type` = 'shop_order' AND
    (pm.meta_key = '_statusCDLR' AND pm.meta_value <> 1 OR pm.meta_key <> '_statusCDLR') 
group by

Любая помощь будет оценена для достижения того, что мне нужно.

1 Ответ

0 голосов
/ 16 января 2019

Я понимаю, что вы должны выбрать id из posts, что:

  • либо имеют соответствующую запись в cdlr_post_meta с meta_key = 'statusCDLR' и meta_value <> 1

  • или не имеют записи cdlr_post_meta с meta_key = 'statusCDLR'

Стратегия для достижения этой цели заключается в использовании LEFT JOIN для поиска записи в cdlr_post_meta с помощью meta_key = 'statusCDLR', а затем реализации остальной логики в предложении WHERE (если нет соответствующей записи все столбцы pm NULL).

SELECT p.ID
FROM cdlr_posts p
LEFT JOIN cdlr_postmeta pm 
    ON pm.post_id = p.ID AND pm.meta_key = '_statusCDLR'
WHERE 
    p.post_type = 'shop_order'
    AND ( pm.post_id IS NULL OR pm.meta_value <> 1 )
GROUP BY p.ID

PS - Общие замечания относительно вашего sql:

  • При смешивании OR с и AND с необходимо заключить тестовые выражения в круглые скобки, чтобы избежать проблем прецедентности (AND имеет более высокий приоритет, чем OR).

  • Вы должны использовать явные JOIN s вместо неявных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...