mySQL在数组中搜索id

时间:2014-03-22 16:11:10

标签: php mysql sql arrays wordpress

我想用一些ID数组过滤我的SQL查询。

所以我有ID例如:2,3,4和activity_meta.value 1,2,5; 我希望在activity_meta.value

中找到所有具有id的活动
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) 我只是不知道如何对待序列化数组;

1 个答案:

答案 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不匹配,您可以,对其进行处理。
  • 为了确保您没有错过FIRST或LAST项目(没有前导/尾随,,您需要首先将该列与另外两个,连接起来:
然后

查询包含以下附加标准。

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个用户网站还是百万客户门户网站,您可以使用其中任何一个。首选解决方案是规范化您的表格。)