我在运行 MariaDB 的开发机器上使用 WAMP。在服务器上我使用MySQL。主页是按元值排序的事件列表:event_date。这是由 Wordpress 生成的查询
SELECT wp_posts.ID, wp_postmeta.meta_value
FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
WHERE 1=1 AND (
wp_postmeta.meta_key = 'event_date_time'
AND
(
(
( mt1.meta_key = 'event_date_time' AND CAST(mt1.meta_value AS DATE) >= '2024-04-09' )
)
)
) AND wp_posts.post_type = 'tc_events' AND ((wp_posts.post_status = 'publish'))
GROUP BY wp_posts.ID
ORDER BY wp_postmeta.meta_value ASC
LIMIT 0, 200;
这是使用参数的普通 WordPress WP_Query。 在服务器(Ubuntu/Apache/MySQL)上运行良好。但在运行 MariaDB 的笔记本电脑上,Order By 被忽略。浏览 intarwebs,似乎 MariaDB 更严格地遵守 SQL 标准,并且 Order By 存在问题。但是同一个 intarwebs 上的所有内容都表明 MariaDB 适合 Wordpress?
从技术上讲,WordPress 应该可以与 MariaDB 一起正常工作,并且查询应该在 MySql 和 MariaDB 上产生相同的结果。您需要验证是否存在任何版本冲突https://make.wordpress.org/hosting/handbook/compatibility/#wordpress-php-mysql-mariadb-versions
MariaDB 对于同时使用 GROUP BY 和 ORDER BY 的查询往往更加严格。在 MariaDB 中,您需要在 GROUP BY 子句中包含 SELECT 子句中的所有非聚合列。 所以尝试改变你的 GROUP BY 子句
GROUP BY wp_posts.ID,wp_postmeta.meta_value
查询
JOINs
到wp_postmeta
两次。 ORDER BY
中使用的那个是不明确的。以下可能解决该问题以及许多其他问题:
SELECT wp_posts.ID, mt1.meta_value
FROM wp_posts
INNER JOIN wp_postmeta AS mt1 ON ( wp_posts.ID = mt1.post_id )
WHERE mt1.meta_key = 'event_date_time'
AND mt1.meta_value >= '2024-04-09'
AND wp_posts.post_type = 'tc_events'
AND wp_posts.post_status = 'publish'
ORDER BY mt1.meta_value ASC
LIMIT 0, 200;
备注:
GROUP BY
似乎没用(或者可能不正确)