我想用一些ID数组过滤我的SQL查询。
所以我有ID例如:2,3,4和activity_meta.value
1,2,5;
我希望在activity_meta.value
SELECT DISTINCT a.*, u.user_email, u.user_nicename, u.user_login, u.display_name
FROM wp_bp_activity a
LEFT JOIN wp_users u
ON a.user_id = u.ID
INNER JOIN wp_bp_activity_meta
ON (a.id = wp_bp_activity_meta.activity_id)
WHERE a.is_spam = 0
AND a.hide_sitewide = 0
AND a.type != 'activity_comment'
AND (wp_bp_activity_meta.meta_key = 'activity_tagz' )
DESC LIMIT 0, 20
我想添加AND (1,2,3 IN wp_bp_activity_meta.meta_value)
我只是不知道如何对待序列化数组;
答案 0 :(得分:1)
activity_meta.value
的值未规范化。这是一个更好的选择,创建第二个表,您可以在其中为元素分配元标记。
所以,它看起来像:
wp_bp_activity_id | meta
1 | 1
1 | 2
1 | 3
让我们来这个表" meta_relation"。然后你就可以使用subselect,就像这样:
... WHERE wp_bp_activity.id in (SELECT wp_bp_activity_id FROM meta_relation WHERE meta in (1,2,5))
或者您可以使用其他联接实现此功能,例如
... INNER JOIN meta_relation ON wp_bp_activitiy.id = meta_relation.wp_bp_activity_id
(将为3个匹配的标签返回3行)
... WHERE meta in (1,2,5)
... GROUP BY wp_bp_activity.id
(将删除任何重复的结果和不需要的标签)
对于您当前的方案,您可以使用解决方法。但是,这需要以编程方式构建查询:
对于每个"标记",您想要找到(即1,2,5
)您需要添加另一个或条件。
2
内的125
不匹配,您可以,
对其进行处理。,
,您需要首先将该列与另外两个,
连接起来:查询包含以下附加标准。
SELECT
....
WHERE
...
AND
(
CONCAT(CONCAT(",", activity_meta.value ), ",") LIKE "%,1,%" OR
CONCAT(CONCAT(",", activity_meta.value ), ",") LIKE "%,2,%" OR
CONCAT(CONCAT(",", activity_meta.value ), ",") LIKE "%,5,%"
)
如果您希望显示所有3个代码,请使用AND
代替OR
。
将匹配:
,2,3,4, against ,1,
,2,3,4, against ,2, //match
,2,3,4, against ,5,
订单和/或差距与此方法无关。
(根据其是10个用户网站还是百万客户门户网站,您可以使用其中任何一个。首选解决方案是规范化您的表格。)