У меня есть база данных Wordpress MySQL, мне нужно создать пользовательский запрос для использования SQL. Я пытаюсь вернуть текущее событие (сообщение), где значение date_start меньше текущего дня, а значение date_end больше или равно текущему дню. Я знаю, что существует запись данных, которая должна быть возвращена, но ничего не возвращается, когда я пытаюсь выполнить поиск как по "date_start", так и по "date_end"
Это мой старый оператор SQL:
select ID, post_name, meta_id, meta_key, meta_value from wp_posts inner join wp_postmeta on wp_posts.ID = wp_postmeta.post_id and ((meta_key='date_end' and meta_value >= CURDATE() + interval 1 day) and (meta_key='date_start' and meta_value < CURDATE())) where post_type='programs' order by meta_value
Новый оператор SQL:
SELECT
ID,
post_name,
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start') AS 'date_start',
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end') AS 'date_end'
FROM wp_posts
WHERE
post_type = 'programs'
AND ((CURDATE() >= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start'))
AND (CURDATE() <= (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end')))
ORDER BY 'wp_posts'.'ID' ASC
И возвращаемая дата:
ID post_name date_start date_end
1221 culture-analytics 20160307 20160610
2446 culture-analytics-tutorials 20160308 20160311
Я также пробовал, где в предложении WHERE была часть date_start и date_end внутреннего соединения.
ВАЖНО: wp_postmeta является схемой Many To 1, тогда как date_start и date_end являются отдельными записями, но обе указывают на один и тот же PostID
В чем проблема.
У вас есть два противоречивых ограничения на meta_key. Ваш запрос ожидает, что meta_key будет равен и date_start, и date_end одновременно.
Может быть, попробовать что-то вроде этого:
SELECT
ID,
post_name,
meta_id,
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start') AS 'date_start',
(SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end') AS 'date_end'
FROM wp_posts
WHERE
post_type = 'programs'
AND (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_start') < CURDATE()
AND (SELECT meta_value FROM wp_postmeta WHERE wp_postmeta.post_id = ID AND meta_key = 'date_end') >= (CURDATE() + INTERVAL 1 DAY)
ORDER BY 4
У меня нет доступа к базе данных Wordpress, поэтому я не запускаю ее, но она может работать...
@obe уловил основную проблему с вашим исходным запросом в своем ответе; но я бы решил это с помощью дополнительного объединения, а не четырех подзапросов:
SELECT ID, post_name, meta_id
, beginMeta.meta_key As beginKey, endMeta.meta_key AS endKey
, beginMeta.meta_value AS beginDate
, endMeta.meta_value AS endDate
FROM wp_posts
INNER JOIN wp_postmeta AS endMeta
ON wp_posts.ID = endMeta.post_id
AND endMeta.meta_key='date_end'
AND endMeta.meta_value >= CURDATE() + interval 1 day
INNER JOIN wp_postmeta AS beginMeta
ON wp_posts.ID = beginMeta .post_id
AND beginMeta.meta_key='date_start'
AND beginMeta.meta_value < CURDATE()
WHERE post_type='programs'
ORDER BY beginDate, endDate
;
Изменение: Предполагается, что (post_id, meta_key) комбинации являются уникальными в wp_postmeta.
ORDER BY
может использовать псевдонимы ... о, да ... и да, эта секунда - глупость копирования-вставки. Крепление ....
meta_value >= CURDATE() + interval 1 day
- это не то же самое, что «больше или равно текущему дню», это «больше или равно завтра». Кроме того, если значения являются строками, вам может потребоваться выполнить некоторые преобразования типов, чтобы получить ожидаемые / необходимые результаты сравнения.