查询 wp_postmeta 表以返回在一个元值上具有 LIKE 条件的 post_id 行并按另一个元值排序

问题描述 投票:0回答:2

我目前拥有此功能,因此我可以在元键“product_info”中显示“未找到产品数据”的产品结果

我当前的查询是这样的 SQL:

SELECT *
FROM `wp_postmeta`
WHERE `meta_key` LIKE 'product_info'
    AND `meta_value` LIKE '%Product data not found%'

除此之外,我需要能够按照从最旧到最新的顺序显示它们,并且这些数据可以在meta_key“last_update”中以数字形式找到,如示例所示。

我将如何使用meta_key“last_update”进行用户order by

SQL 结构示例

post_id   meta_key         meta_value
19248   product_info     Product data not found
19248   last_update      1959520849
19249   product_info     Product data not found
19249   last_update      1659520849
19250   product_info     OK
19250   last_update      1759520849
19251   product_info     Product data not found
19251   last_update      1859520849

我希望能达到这个结果

post_id   meta_key         meta_value
19249   product_info     Product data not found
//not visible result 19249   last_update      1659520849
19251   product_info     Product data not found
//not visible result 19251   last_update      1859520849
19248   product_info     Product data not found
//not visible result 19248   last_update      1959520849

正如我们所看到的,它是从最低的数字开始排序的,仅考虑到他们在product_info“未找到产品数据”中的post_id

不可见的结果=我把它放出来,这样你就可以看到它是按时间排序的

抱歉,如果问题措辞不好,我是 SQL 新手。

php sql wordpress pivot post-meta
2个回答
1
投票

您需要再次

JOIN
wp_postmeta
,寻找相同的
post_id
meta_key
last_update
。然后您可以
ORDER BY
第二个表中的
meta_value

SELECT wp1.*
FROM wp_postmeta wp1
LEFT JOIN wp_postmeta wp2 ON wp2.post_id = wp1.post_id AND wp2.meta_key = 'last_update'
WHERE wp1.meta_key LIKE 'product_info' AND wp1.meta_value LIKE '%Product data not found%'
ORDER BY COALESCE(wp2.meta_value, 0)

样本数据的输出:

post_id meta_key        meta_value
19249   product_info    Product data not found
19251   product_info    Product data not found
19248   product_info    Product data not found

db-fiddle.com 上进行演示

请注意,我使用

LEFT JOIN
COALESCE
来处理任何没有
last_update
值的帖子。
0
中的
COALESCE
值表示这些帖子将首先排序;如果您希望它们排在最后,请使用
COALESCE(wp2.meta_value, 2147483647)
代替。


0
投票

在这种表结构中累积相关数据的一种非常常见的方法是执行透视。已知列名的数据透视查询使开发和维护查询变得更加容易,因为从聚合数据中提取所需的值后,您可以享受非常简单的访问。

使用 GROUP BY 和筛选聚合数据的好处最初可能看起来需要大量工作,但是当您开始为单个

post_id
堆积多行时,这种方法确实会带来回报。

架构(MySQL v8.0)

CREATE TABLE wp_postmeta (
  `post_id` INTEGER,
  `meta_key` VARCHAR(50),
  `meta_value` VARCHAR(50)
);

INSERT INTO wp_postmeta
  (`post_id`, `meta_key`, `meta_value`)
VALUES
  ('19248', 'product_info', 'Product data not found anywhere'),
  ('19248', 'last_update', '1959520849'),
  ('19249', 'product_info', 'This Product data not found'),
  ('19249', 'last_update', '1659520849'),
  ('19250', 'product_info', 'OK'),
  ('19250', 'last_update', '1759520849'),
  ('19251', 'product_info', 'Product data not found ...yes, I looked'),
  ('19251', 'last_update', '1859520849');

查询 在 DB Fiddle 上查看

SELECT post_id,
       MAX(CASE meta_key WHEN 'product_info' THEN meta_value END) product_info,
       MAX(CASE meta_key WHEN 'last_update' THEN meta_value END) last_update
FROM wp_postmeta
GROUP BY post_id
HAVING MAX(CASE meta_key WHEN 'product_info' THEN meta_value END) LIKE '%Product data not found%'
ORDER BY last_update;
帖子_id 产品信息 最后更新
19249 未找到该产品数据 1659520849
19251 未找到产品数据...是的,我查了一下 1859520849
19248 在任何地方都找不到产品数据 1959520849

我之前就枢轴主题给出的一些相关建议:

© www.soinside.com 2019 - 2024. All rights reserved.