Wordpress MySQL - 按键和日期自定义元键顺序

时间:2015-02-20 12:58:59

标签: mysql sql wordpress

我有一个由选择下拉菜单设置的元键,因此用户可以选择1到14之间的选项,然后保存他们的帖子。我希望帖子显示在按日期排序的1到14页面上,但如果用户第二天创建了一组新帖子,我也希望这样做,所以每天都有1到14个帖子按顺序显示。我到目前为止的SQL如下

    SELECT  SQL_CALC_FOUND_ROWS
            wp_postmeta.meta_key, 
            wp_postmeta.meta_value,
            wp_posts.*
       FROM wp_posts  
 INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
      WHERE 1=1
        AND wp_posts.post_type = 'projectgallery'
       AND (      wp_posts.post_status = 'publish' 
               OR wp_posts.post_status = 'private')
       AND (wp_postmeta.meta_key = 'gallery_area' )
  GROUP BY wp_posts.post_date asc
  ORDER BY CAST(wp_postmeta.meta_value AS UNSIGNED) DESC,
           DATE(wp_posts.post_date) desc;

这给了我以下输出,表明在不同日期输入的帖子有1或3按顺序显示,理想情况下我希望最新的帖子在14之后直接显示,所以它重新开始。数字14不应该是静态的,好像有人为选择添加了另一个选项,然后如果删除了一个选项,它将增加和减少。 enter image description here

1 个答案:

答案 0 :(得分:0)

GROUP BY令人困惑地命名。只有在SUM()子句中有COUNT()SELECT或某些此类函数时才有意义。它在这里没用。

将post_meta.value获取到帖子项结果集的规范方法就是这样。你很接近,但这使得阅读更容易。

SELECT  SQL_CALC_FOUND_ROWS
        ga.meta_value gallery_area,
        p.*
   FROM wp_posts p  
   LEFT JOIN wp_postmeta ga ON p.ID = ga.post_id AND ga.meta_key = 'gallery_area'
  WHERE 1=1
   AND p.post_status IN ('publish', 'private')
   AND p.post_type = 'projectgallery' 

请注意ONJOIN子句的两个部分。这种做SQL的方法只能让你干净利落地获得meta_key值。

那么,这就是你的结果集。每个帖子都会有一行。如果缺少元数据,您将获得gallery_area的NULL值。

然后你必须按照你想要的方式订购结果集。按日期排序,然后按gallery_area排序,如下:

ORDER BY DATE(p.post_date) DESC, 
      0+gallery_area ASC

0+value技巧是sql的简写,用于将值转换为整数。

修改即可。如果meta_value项包含前导空格等无关字符,则事情可能会被污染。尝试使用这些更改进行诊断。把

  DATE(p.post_date) pdate,
  0+ga.meta_value numga,
  ga.meta_value gallery_area

SELECT子句中。如果某些numga项目出现为零,那么这就是您的问题。

也可以尝试

 ORDER BY DATE(p.post_date) DESC,
          0+TRIM(gallery_area) ASC

试图摆脱空间。但它们可能不是空格。