在字符串中按ID选择行,其中id由逗号

时间:2015-08-05 18:29:56

标签: mysql wordpress

我必须编写一个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'

感谢您的帮助,谢谢:)

1 个答案:

答案 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小提琴。此外,随着数据的扩展,这将是一个非常缓慢的查询。将列表存储为字段时出现问题。更好的解决方案是每行存储一个值。

相关问题