0

我正在尝试使用查询制作 wordpress 短代码。我必须查询最后一天和上周的产品订单数量。

我不知道如何按日期过滤(日期也是文本格式)。非常感谢。

直到现在我这样做了:

桌子:

post_id 元密钥 元值
164 订购日期 09-12-2020 18:17
164 order_items_5_order_product 巧克力
164 order_items_6_order_product 心理
165 订购日期 05-12-2020 14:35
165 order_items_1_order_product 巧克力
165 order_items_2_order_product 心理
165 order_items_3_order_product 格兰尼佐
166 订购日期 2020 年 2 月 10 日 11:37
166 order_items_5_order_product 巧克力
166 order_items_6_order_product 心理

询问:

SELECT meta_value, COUNT(*) Totales_Pedidos FROM tc_10_postmeta um WHERE meta_key LIKE "order_items_%_order_product" GROUP BY meta_value ORDER BY Totales_Pedidos desc

结果:

元密钥 Totales_Pedidos
巧克力 3
心理 3
格兰尼佐 1

短代码:

function fln_table_shortcode() {
 global $wpdb;
 $html = "";
 $result = $wpdb->get_results('SELECT meta_value, COUNT(*) Totales_Pedidos FROM tc_10_postmeta um WHERE meta_key LIKE "order_items_%_order_product" GROUP BY meta_value ORDER BY Totales_Pedidos desc');
 $count = $wpdb->num_rows;
 if($count >0){
  $html .="<table>";    
    $html .="<tr><td><strong>PRODUCT</strong></td><td><strong>NUMBER OF ORDERS</strong></td></tr>";
    $html .="<tr>";
  foreach($result as $r){
    $html .="<td>".$r->meta_value."</td>";
    $html .="<td>".$r->Totales_Pedidos."</td>";
    $html .="</tr>";
   }
  $html .="</table>";
}

return $html;
}
add_shortcode( 'table_shortcode','fln_table_shortcode');
4

1 回答 1

0

基本上,您必须使用数据透视表和准备好的语句来生成动态表

CREATE TABLE tc_10_postmeta 
    (`post_id` int, `meta_key` varchar(27), `meta_value` varchar(16))
;
    
INSERT INTO tc_10_postmeta 
    (`post_id`, `meta_key`, `meta_value`)
VALUES
    (164, 'order_date', '09-12-2020 18:17'),
    (164, 'order_items_5_order_product', 'chcolate'),
    (164, 'order_items_6_order_product', 'menta'),
    (165, 'order_date', '05-12-2020 14:35'),
    (165, 'order_items_1_order_product', 'chcolate'),
    (165, 'order_items_2_order_product', 'menta'),
    (165, 'order_items_3_order_product', 'granizo'),
    (166, 'order_date', '02-10-2020 11:37'),
    (166, 'order_items_5_order_product', 'chcolate'),
    (166, 'order_items_6_order_product', 'menta')
;
SELECT
    `post_id`,
    MAX(IF(`meta_key` = 'order_date', STR_TO_DATE(`meta_value`, '%m-%d-%Y %H:%i'), NULL ))  as ORDERDate
    , SUM(IF(`meta_key`  LIKE "order_items_%_order_product" AND  `meta_value` = 'chcolate',1,0)) as 'chcolate'
    ,SUM(IF(`meta_key`  LIKE "order_items_%_order_product" AND  `meta_value` = 'menta',1,0)) as 'menta'
    ,SUM(IF(`meta_key`  LIKE "order_items_%_order_product" AND  `meta_value` = 'granizo',1,0)) as 'granizo'
FROM tc_10_postmeta
GROUP BY `post_id`
post_id | 订购日期 | 巧克力| 精神 | 格兰尼佐
------: | :----------------- | --------: | ----: | ------:
    164 | 2020-09-12 18:17:00 | 1 | 1 | 0
    165 | 2020-05-12 14:35:00 | 1 | 1 | 1
    166 | 2020-02-10 11:37:00 | 1 | 1 | 0
SET @sql ='';
SELECT 
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(`meta_key`  LIKE "order_items_%_order_product" AND  `meta_value` = "',
     `meta_value`,
      '",1,0)) AS "',
      `meta_value`, '"'      
    )
  ) 
  INTO @sql
FROM tc_10_postmeta
WHERE `meta_key`  LIKE "order_items_%_order_product";
SET @sql = CONCAT('select `post_id`
                  ,MAX(IF(`meta_key` = "order_date", STR_TO_DATE(`meta_value`, "%m-%d-%Y %H:%i"), NULL ))  as ORDERDate
                  ,',@sql,' from tc_10_postmeta
                  group by `post_id`');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
post_id | 订购日期 | 巧克力| 格兰尼佐 | 心理
------: | :----------------- | --------: | ------: | ----:
    164 | 2020-09-12 18:17:00 | 1 | 0 | 1
    165 | 2020-05-12 14:35:00 | 1 | 1 | 1
    166 | 2020-02-10 11:37:00 | 1 | 0 | 1

db<>在这里摆弄

于 2021-01-24T14:58:30.727 回答