我有一个由选择下拉菜单设置的元键,因此用户可以选择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不应该是静态的,好像有人为选择添加了另一个选项,然后如果删除了一个选项,它将增加和减少。
答案 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'
请注意ON
中JOIN
子句的两个部分。这种做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
试图摆脱空间。但它们可能不是空格。