【问题标题】:Wordpress WP_List_Table sort data query problemWordpress WP_List_Table排序数据查询问题
【发布时间】:2020-12-18 03:36:43
【问题描述】:

我正在使用 wordpress 5.5 和 php 7.4 和 mysql 5.7.30 我正在为我的电子商务系统使用 woocomerce 订阅插件。 我想要的是能够在管理面板中显示 paginatd 订阅列表 和(重要部分)根据管理面板中的“next_payment_schedule”、“first_payment_schedule”日期对它们进行排序。 woocommerce 订阅插件将所有订阅保留为自定义帖子类型,其类型为:“shop_subscription”,并且还将其所有特定字段保留在 postmeta 表中。

问题正如我所说,这个插件将这些日期保存在 postmeta 表中。 如何同时支持分页和排序?

这是我当前的查询:

SELECT p.id AS post_id, p.post_status, u.id AS user_id , u.user_login, u.user_email, GROUP_CONCAT(pm.meta_value)
FROM posts AS p
INNER JOIN users AS u ON p.post_author = u.id
INNER JOIN postmeta AS pm ON pm.post_id = p.id 
WHERE post_type = 'shop_subscription'
AND pm.meta_key in ('_schedule_start', '_schedule_next_payment')
GROUP BY p.id
ORDER BY user_login ASC

当我想处理分页时,这个查询很好。

当我想处理排序时,以下查询很好,

SELECT p.id AS post_id, p.post_title, p.post_status, p.post_name, u.id AS user_id , u.user_login, u.user_email, pm.meta_key, pm.meta_value from posts AS p
INNER JOIN postmeta AS pm ON pm.post_id = p.id 
INNER JOIN users AS u ON p.post_author = u.id 
WHERE post_type = 'shop_subscription' 
AND pm.meta_key in ('_schedule_start', '_schedule_next_payment') 
ORDER BY CASE WHEN pm.meta_key IN('_schedule_next_payment') THEN pm.meta_value END desc

我应该如何处理这种情况?

【问题讨论】:

    标签: mysql sql wordpress woocommerce woocommerce-subscriptions


    【解决方案1】:

    最后我用这个查询解决了我的问题:

            $sql = "SELECT p.id AS post_id, p.post_status, u.id AS user_id , u.user_login, u.user_email, pm2.schedule_start,  pm2.schedule_next_payment
                    FROM `$wpdb->posts` AS p
                    INNER JOIN `$wpdb->users` AS u ON p.post_author = u.id
                    INNER JOIN (
                        SELECT t.post_id, 
                               MAX(t.schedule_start) AS schedule_start, 
                               MAX(t.schedule_next_payment) AS schedule_next_payment
                        FROM (
                    
                        SELECT 
                                post_id,
                                case when pm.meta_key = '_schedule_start' then pm.meta_value else 0 end AS schedule_start,
                                case when pm.meta_key = '_schedule_next_payment' then pm.meta_value else 0 end AS schedule_next_payment
                                FROM (SELECT * FROM `$wpdb->postmeta` pm where pm.meta_key IN ('_schedule_next_payment', '_schedule_start')) AS pm
                        ) AS t
                        GROUP BY t.post_id
                    ) 
                    
                    AS pm2 ON pm2.post_id = p.id
                    WHERE post_type = '".self::POST_TYPE."'"
    
    

    如果您仔细查看以下子查询:

                        SELECT t.post_id, 
                               MAX(t.schedule_start) AS schedule_start, 
                               MAX(t.schedule_next_payment) AS schedule_next_payment
                        FROM (
                            SELECT 
                                    post_id,
                                    case when pm.meta_key = '_schedule_start' then pm.meta_value else 0 end AS schedule_start,
                                    case when pm.meta_key = '_schedule_next_payment' then pm.meta_value else 0 end AS schedule_next_payment
                                    FROM (SELECT * FROM `$wpdb->postmeta` pm where pm.meta_key IN ('_schedule_next_payment', '_schedule_start')) AS pm
                            ) AS t
                        GROUP BY t.post_id
    
    

    您可以看到我更改了 postmeta 表的列和行(旋转表) 我可以轻松地将它与我的帖子表和基于这两个日期字段的顺序连接起来。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 2012-03-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多