我必须编写一个mysql查询,它将从wp_posts表(post_type附件)中获取行,该id位于由wp_postmeta内的逗号分隔的id字符串内。
这可能听起来很复杂,但它很简单,这是一个例子:
如果表格包含以下数据:
wp_posts:
ID | post_type
1 | attachment
2 | attachment
3 | attachment
4 | contest
5 | contest
wp_postmeta:
ID | post_id | meta_key | meta_value
1 | 4 | contest_works | 1,2
1 | 5 | contest_works | 3
运行查询后我想得到:
ID | post_type
1 | attachment
2 | attachment
3 | attachment
我想出了下面的查询,但由于某种原因,它返回了帖子类型竞赛的行而不是附件。
SELECT * FROM wp_posts work
INNER JOIN wp_posts AS contest ON
(
SELECT meta_value
FROM wp_postmeta contestmeta
WHERE contest.ID = contestmeta.post_id AND contestmeta.meta_key = 'contest_works'
) LIKE CONCAT('%', work.ID, '%') AND contest.post_type = 'contest'
WHERE work.post_type = 'attachment'
感谢您的帮助,谢谢:)
答案 0 :(得分:4)
只需使用find_in_set()
:
SELECT p.*
FROM wp_posts p INNER JOIN
wp_postmeta pm
on pm.meta_key = 'contest_works' and
find_in_set(p.id, pm.meta_value)
WHERE p.post_type = 'attachment';
强烈建议不要在逗号分隔的列表中存储列表。唉,这似乎是Word Press数据模型中合理的数据结构。
Here是一个SQL小提琴。此外,随着数据的扩展,这将是一个非常缓慢的查询。将列表存储为字段时出现问题。更好的解决方案是每行存储一个值。