wordpress 查询wp_postmeta表以返回post_id行,其中一个meta_value具有LIKE条件,并按另一个meta_value排序

1l5u6lss  于 5个月前  发布在  WordPress
关注(0)|答案(2)|浏览(69)

我目前有这个,所以我可以显示产品结果说:“产品数据未找到”在Meta_key“product_info”
我的当前查询是这样的SQL:

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

字符串
除此之外,我需要能够显示他们从最旧的到最新的顺序,这些数据是在Meta键“last_update”中找到的数字形式的例子。
如何使用Meta_key“last_update”执行userorder 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新手。

50pmv0ei

50pmv0ei1#

您需要再次从JOINwp_postmeta,查找相同的post_idlast_updatemeta_key。然后您可以从第二个表中ORDER BYmeta_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 JOINCOALESCE来处理任何没有last_update值的帖子。COALESCE中的0值意味着这些帖子将首先排序;如果你想让它们最后排序,请使用COALESCE(wp2.meta_value, 2147483647)

2ul0zpep

2ul0zpep2#

一个非常常见的方法是在这样的表结构中积累相关数据,执行一个pivot。一个已知列名的pivot查询使查询的开发和维护变得更加容易,因为在从聚合数据中挤出所需的值之后,您可以享受非常简单的访问。
使用GROUP BY和筛选聚合数据的好处最初看起来似乎是很多工作,但是当您开始为单个post_id堆积多行时,这种方法确实会看到它的回报。

Schema(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');

字符串

查询View on 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;


| 发布标识|产品信息|最后更新|
| --|--|--|
| 19249 |未找到此产品数据| 1659520849 |
| 19251 |没有找到产品数据.是的,我看了| 1859520849 |
| 19248 |在任何地方都找不到产品数据| 1959520849 |
我之前就透视表给出的一些相关建议:

相关问题