MYSQL - метод множественного выбора и LIKE - PullRequest
1 голос
/ 02 сентября 2010

Что я хочу это: Получайте сообщения с датой, превышающей 2010-03-02, и с мета-значением 'что-то' + вроде '2010 -'

потому что есть другие значения, такие как 239048192304 или 293811743

$query = "SELECT DISTINCT wp_postmeta.meta_key, wp_postmeta.meta_value, wp_posts.ID, wp_posts.guid, wp_postmeta.post_id, wp_posts.post_title
FROM wp_postmeta
INNER JOIN wp_posts
ON wp_postmeta.post_id=wp_posts.ID
WHERE wp_postmeta.meta_value >='2010-03-02'
AND wp_postmeta.meta_value = 'something'
AND wp_postmeta.meta_value LIKE '2010-'
ORDER BY wp_postmeta.meta_value ASC
LIMIT 0,10";

Можете ли вы помочь мне, пожалуйста? спасибо!

Update2:

таблица wp_postmeta

post_id | meta_value    
5       | 2010-12-30    
5       | Berlin

3       | 2010-12-29
3       | Paris

2       | 2009-12-29
2       | Paris

14      | 12232456521
14      | Berlin

Выход:

2010-12-30 Berlin ID 5
2010-12-29 Paris  ID 3

Ответы [ 5 ]

3 голосов
/ 02 сентября 2010

Может быть, вы имеете в виду OR вместо AND?

...
WHERE wp_postmeta.meta_value >= '2010-03-02' OR
      wp_postmeta.meta_value = 'something' OR
      wp_postmeta.meta_value LIKE '2010-'

К сожалению, в английском языке AND и OR могут использоваться взаимозаменяемо в некоторых случаях:

  • «Я всегда ношу с собой зонт для дождя и снега».
  • «Я всегда ношу с собой зонт для дождя или снега».

Выше не будетбыть эквивалентным для компьютеров:)

2 голосов
/ 02 сентября 2010

Набор данных большего размера и примерный ответ помогут прояснить вопрос, но вот моя интерпретация того, что вы ищете. Это не элегантно, но если у вас есть выделенное буферное пространство, оно работает.

SELECT DISTINCT wp_postmeta.meta_key, wp_postmeta.meta_value, wp_posts.ID, wp_posts.guid, wp_postmeta.post_id, wp_posts.post_title
FROM wp_postmeta
INNER JOIN wp_posts
ON wp_postmeta.post_id=wp_posts.ID
WHERE wp_postmeta.post_id IN (
    select post_id from wp_postmeta where str_to_date(meta_value, '%Y-%m-%d') >= 2010-03-02' and post_id in (select post_id from wp_postmeta where meta_value = 'something')
);
1 голос
/ 02 сентября 2010

Для получения информации о публикации и ее мета-значений необходимо выполнить следующий запрос:

SELECT DISTINCT wp_postmeta.meta_key, wp_postmeta.meta_value, wp_posts.ID,
                wp_posts.guid, wp_postmeta.post_id, wp_posts.post_title
FROM   wp_postmeta JOIN wp_posts
ON     wp_postmeta.post_id = wp_posts.ID
WHERE  wp_posts.post_date >= '2010-03-02'
AND    EXISTS (SELECT 1 from wp_postmeta m1 
               WHERE m1.post_ised = wp_posts.ID
               AND wp_postmeta.meta_value = 'something'
AND    EXISTS (SELECT 1 from wp_postmeta m2 
               WHERE m2.post_ised = wp_posts.ID
               AND wp_postmeta.meta_value LIKE '2010-%')
ORDER  BY wp_postmeta.meta_value 
ASC LIMIT 0, 10
1 голос
/ 02 сентября 2010

Попробуйте это:

$query = "SELECT p.ID, m1.meta_value, m2.meta_value, p.post_title FROM
          wp_posts p, wp_postmeta m1, wp_postmeta m2
          WHERE p.post_date > '2010-03-02' AND
          m1.post_id=p.ID AND m2.post_id=p.ID AND 
          m2.meta_value LIKE '2010-%' AND 
          m1.meta_value = 'something'
          ORDER BY m1.meta_value, m2.meta_value 
          LIMIT 0,10";

Не нужно различать, так как мы все равно показываем все в одном ряду.

0 голосов
/ 02 сентября 2010

Эти утверждения противоречат сами себе. Сначала вы просите, чтобы это было> = дата. Так является ли meta_value датой? Тогда вы говорите, что это должно быть приравнено к «чему-то», так что теперь это строка, а не дата. Наконец, вы говорите, что это будет как 2010-, так что теперь мы вернулись к строке или дате, но без подстановочных знаков % в подобном, так что вы в основном говорите, что это должно быть равно 2010-му.

  • Какое значение хранится в meta_value?
  • Вы уверены, что не хотите запрашивать несколько полей?

UPDATE

Основываясь на новой информации, я думаю, это то, что вы хотите:

$query = "SELECT DISTINCT wp_postmeta.meta_key, wp_postmeta.meta_value, wp_posts.ID, wp_posts.guid, wp_postmeta.post_id, wp_posts.post_title
FROM wp_postmeta
INNER JOIN wp_posts
ON wp_postmeta.post_id=wp_posts.ID
WHERE (wp_postmeta.meta_value = 'something'
OR wp_postmeta.meta_value LIKE '2010-%')
ORDER BY wp_postmeta.meta_value ASC
LIMIT 0,10";

Надеюсь, это то, что вы были после. Я удалил условие 2010> =, учитывая, что условие 2010 LIKE будет извлекать те же данные.

...