2010-09-02 37 views
1

我要的是: 获取与日期更大的帖子,然后2010-03-02并与meta_value“东西” +喜欢“2010-2011”MYSQL - 多选择和类似方法

因为有像其他值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 
+2

这没有意义。怎样才能成为“东西”,同时又以“2010-”开头?你能改说吗? – 2010-09-02 14:32:41

+0

这里是一个例子: 表wp_postmeta post_id | meta_value 5 | 2010-12-30 5 |东西 3 | 12232456521 – ali 2010-09-02 14:35:48

回答

2

更大的数据集和样本的回答会有助于澄清问题,但这里是我的,你在找什么解释。这不是优雅的,但如果你已经分配了缓冲空间,它就可以工作。

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') 
); 
+0

这看起来很有趣,我怎样才能在循环中回显标题? echo $ query_row ['post_title']; ? – ali 2010-09-02 15:05:24

0

这些陈述自相矛盾。首先你要求它是> =一个日期。 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条件会提取相同的数据。

3

也许你的意思是一个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可以在某些情况下可以互换使用:“我总是随身携带的,下雨时和下雪的保护伞”

  • “我总是在下雨或下雪时带伞。”

以上不会为电脑相当于:)

+0

wp_postmeta是表格(post_id,键值)。所以他可能真的需要选择哪些瓦特是'东西'的帖子,像'2010-%' – 2010-09-02 14:48:03

+0

@迈克尔:你可能是对的。没有使用wordpress数据库的经验...但是,答案可能有助于OP了解为什么该查询无法工作。 – 2010-09-02 14:51:51

1

试试这个:

$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"; 

无需为不同的,因为我们显示在一行一切反正。

1

为了得到职位信息和它们的后元值,你需要下面的查询:

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