如何解决MySQL:是否基于正则表达式进行JOIN?有可能吗?
我正在使用高级自定义字段插件和高级自定义字段转发器插件的WordPress网站上工作,所以我无法更改数据库结构。
每个帖子的自定义字段(及其值)存储在名为post_meta
的表中,其中包含以下字段:
meta_id (autoincrement),post_id,meta_key,meta_value
对于常规的自定义字段,这很容易。假设帖子200的字段“ full_name”具有“ John Doe”,那么它将像这样存储:
xxx,200,full_name,John Doe
问题在于,当字段具有重复字段的子集时,其存储方式会更加复杂。对于meta_key
,该值为{fieldName}_{rowNumber}_{subfieldName}
。
例如,在此Wordpress中,我要尝试存储的是参加某项比赛的团队的球员,以及他们参加该比赛的时间(此为屏幕截图):
常规字段称为planilla
(玩家表),因此每个值的存储方式如下:
planilla_1_jugador
,planilla_1_minutos
(第一行的player_id和分钟数)
所以,我的问题开始于我想计算一名球员的所有比赛。我可以统计post_meta
中的所有行,其中meta_value
是我的球员ID ,但这将计入玩家玩了0分钟的比赛(我不想)。顺便说一下,这是查询操作:
SELECT COUNT(*) as total from $wpdb->postmeta INNER JOIN $wpdb->posts ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id ) WHERE( $wpdb->postmeta.meta_key LIKE 'planilla_%_jugador' AND $wpdb->postmeta.meta_value = {player_id} ) AND $wpdb->posts.post_type = 'partido' AND (($wpdb->posts.post_status = 'publish'))
如果我想查看上场时间,则需要添加一个与球员表({{1}})中相同位置相匹配的联接。如果表中有一个名为meta_key_index的额外列,该列将存储数字,它将像这样简单:
planilla
但是还没有,所以我需要使用正则表达式或类似的东西进行连接。我想到了几件事,但似乎没有什么使它可行。
我现在正在做的事情是,我要进行20次查询(每张纸最多可以播放多少个玩家),其中密钥是经过硬编码的,所以不是做SELECT COUNT(*) as total from wp_postmeta pm1 INNER JOIN wp_posts ON ( wp_posts.ID = pm1.post_id )
INNER JOIN wp_postmeta pm2 ON (pm1.post_id = pm2.post_id)
WHERE( pm1.meta_key LIKE 'planilla_%_jugador' AND pm1.meta_value = 420 )
AND (pm2.meta_key LIKE 'planilla_%_minutos_jugados' and pm2.meta_value > 0)
AND (pm1.meta_key_index = pm.meta_key_index)
AND wp_posts.post_type = 'partido' AND ((wp_posts.post_status = 'publish')
,而是查询planilla_%_jugador
,依此类推,然后将所有结果相加。但是20条查询的速度很慢,我宁愿只执行一个查询就解决所有问题。
我希望这篇文章有意义并在此先感谢。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。