MySql запрос не возвращает правильные данные

0

У меня есть база данных 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

В чем проблема.

  • 0
    meta_value >= CURDATE() + interval 1 day - это не то же самое, что «больше или равно текущему дню», это «больше или равно завтра». Кроме того, если значения являются строками, вам может потребоваться выполнить некоторые преобразования типов, чтобы получить ожидаемые / необходимые результаты сравнения.
  • 0
    @Uueerdo да, я знаю о большей или равной, я понимаю эту часть. Если я уберу часть «date_start» или «date_end», будут возвращены записи. но если я включу оба, ничего не вернется. Таким образом, он распознает и преобразует соответственно сравнение даты
Показать ещё 1 комментарий
Теги:
inner-join
where-clause
date-comparison

2 ответа

0
Лучший ответ

У вас есть два противоречивых ограничения на 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, поэтому я не запускаю ее, но она может работать...

  • 0
    спасибо, что это немного помогло, единственное изменение, которое я сделал, было поместить CURDATE () перед оператором "select" в предложении "WHERE", однако он возвращает еще одну запись, чем следовало бы. Date_end для этой дополнительной записи является 20160610
  • 0
    Можете ли вы опубликовать фактический запрос, который вы используете набор данных, который возвращается?
Показать ещё 7 комментариев
0

@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.

  • 0
    Это действительно будет работать лучше ... просто обратите внимание, что во втором запросе это должны быть "beginMeta.meta_key" и "beginMeta.meta_value", а также в ORDER BY вы должны явно написать "beginMeta.meta_value" и "endMeta. meta_value»...
  • 0
    ORDER BY может использовать псевдонимы ... о, да ... и да, эта секунда - глупость копирования-вставки. Крепление ....
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню