【问题标题】:mySQL search for id in arraymySQL在数组中搜索id
【发布时间】:2014-04-30 01:54:17
【问题描述】:

我想用一些 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) 我只是不知道如何处理序列化数组;

【问题讨论】:

  • 所以你有 id 作为数组?
  • 其实这是用逗号分隔的字符串
  • 啊这很简单,那就用wp_bp_activity_meta.meta_value IN (1,2,3)
  • IN 会起作用吗?这更好,因为 wordpress Meta_Query 支持(当 FIND_IN_SET 不支持时)。有没有性能差异
  • @Mpa4Hu 第一次尝试很快就会到来 - 好的答案需要一些思考:)

标签: php mysql sql arrays wordpress


【解决方案1】:

activity_meta.value 的值未标准化。创建第二个表是一个更好的选择,您可以在其中将元标记分配给您的元素。

所以,它看起来像:

wp_bp_activity_id | meta
1              | 1
1              | 2
1              | 3 

让我们将此表命名为“meta_relation”。然后您可以简单地使用子选择,如下所示:

... 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)需要添加另一个或条件。

  • 为确保您与125 中的2 不匹配,您可以用, 环绕它。
  • 为确保您没有遗漏 FIRST 或 LAST 项目(没有前导/尾随 ,,您首先需要将该列与另外 2 个 , 连接起来:

然后查询包含以下附加条件。

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

【讨论】:

  • 所以你建议保存多个元数据而不是使用一个类似的数组?只是为了确保我了解所有内容
  • @Mpa4Hu 查看我的更新:是的,这称为数据库规范化:field value 应该有一个值。如果您想要多个值,请使用多行。
  • 标准化数据库只是为了可读性或性能?如果性能我全力以赴,但可能有数百万个活动,每个活动可以有 1 到 10 个标签,所以我在想这是如何高效的
  • @Mpa4Hu 以获得性能和更好的处理。 (实际上可读性更差,因为需要查找多个表)
  • @Mpa4Hu 做正确的事从来都不是坏事 :-) 查询未经测试,只有关于您应该寻找什么的建议。如果你想深入了解,谷歌搜索n:nmany to many 关系。 (1:none to many 看起来相同,但只有一个不同的(复合)键约束))
猜你喜欢
  • 2014-06-23
  • 1970-01-01
  • 2021-02-28
  • 2016-05-21
  • 1970-01-01
  • 2013-07-25
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多