【问题标题】:Filtering a MySQL query with multiple conditions过滤具有多个条件的 MySQL 查询
【发布时间】:2015-10-28 03:14:29
【问题描述】:

我的输出数组名为“Feed Items” (fi):

(
    [0] => Array
        (
            [reg] => 2015-08-03 13:39:00
            [id] => fd7ec4107d16b07c1a13cbdd386af8d2cb05ffca
            [user_id] => de5fd44db1760b006b1909cf1db11a78b38e455c
            [img] => edee88e88cf6e17732e393b5433cfd894662902e
            [type] => new_join_ambition
        )

)

我生成了一个名为“RemovedFeedItems”(rfi)的数组,其结构如下:

(
    [0] => Array
        (
            [object_id] => fd7ec4107d16b07c1a13cbdd386af8d2cb05ffca
            [postee_id] => de5fd44db1760b006b1909cf1db11a78b38e455c
            [type] => new_join_ambition
        )

)

我的任务是不获取具有以下条件的记录:

ri.id == rfi.object_id && ri.user_id == rfi.postee_id && ri.type == rfi.type

我用来获取 Feed Items 数组的查询是:

SELECT 
                i.registered AS reg, 
                a.id, 
                u.id AS user_id, 
                ui.image_id AS img,  
                'new_join_ambition' AS type, 
            FROM x_ambition_invites i 
                LEFT JOIN x_user u
                    ON i.to = u.id
                LEFT JOIN x_user_images ui 
                    ON u.id = ui.user_id
                LEFT JOIN x_ambitions a
                    ON i.ambition_id = a.id
            WHERE a.registered 
                BETWEEN '2014-07-21 14:25:03' AND '2015-08-05 12:04:41' 
            AND i.to != '8fa7a1679560876eaf2f8060abd916b692c719dc' 
            AND i.to IN ('de5fd44db1760b006b1909cf1db11a78b38e455c')

如何调整我的查询以实现从 FeedItems 数组中删除所述记录的条件?

提前致谢。

【问题讨论】:

  • 您是否尝试将 AND NOT (id == object_id AND user_id == postee_id AND type == type) 添加到 where 子句的末尾 - 显然限定了字段名称(a.id 等)
  • @PaulF 但需要考虑的是后一种情况可能在一个大数组中。那么我该如何从本质上做到以下几点:(a.id == $a[n]['object_id'] AND a.user_id == $a[n]['postee_id'] AND a.type == $a[n]['type']) 通过 removedFeedItems 数组的所有索引
  • 感谢您的澄清 - 认为它不会像我建议的那么简单。

标签: php mysql arrays conditional-statements notin


【解决方案1】:

尝试使用内联表格:

SELECT ... FROM  ... WHERE (a,b,c) NOT IN (SELECT a1, b1, c1 UNION SELECT a2, b2, c2 UNION SELECT...)

缺点是您必须构建一个大查询字符串。 :-(

【讨论】:

  • 您知道这是否是唯一可用的解决方案吗? :)
  • 嗯...不确定,但考虑到 MySQL 既不支持数组也不支持用户定义的数据类型...我想不出别的了。
  • 当然,您可以创建和填充临时表,但必须注意防止并发访问。内联表是 100% 线程安全的。
  • 谢谢。几乎认为我已经搞定了。 :) 只是希望我的用户不要删除太多项目! :P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-22
  • 2020-05-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多