【问题标题】:MySQL - Select only records with same ID and specific value in another columnMySQL - 仅选择另一列中具有相同 ID 和特定值的记录
【发布时间】:2017-02-14 23:02:44
【问题描述】:

我正在尝试找到一种解决方案,通过 SQL 从 WooCommerce 中的数百种产品中删除特定类别。不幸的是,Wordpress 核心仍然无法做到这一点,我还没有找到任何用于批量编辑 WooCommerce 产品类别的插件或代码。

我是 SQL 新手,我尝试将我在这里找到的一些查询放在一起,但它们都不能正常工作。

如果有人知道答案,我相信更多的人会发现这个话题真的很有帮助。

我的产品有多个类别,所以表格如下所示:

object_id  term_taxonomy_id
1          10
1          20
1          30
2          10
2          30
3          20
3          30
3          40
4          10
4          20

我想过滤同时具有类别 10 和 20 的产品..

object_id  term_taxonomy_id
1          10
1          20
4          10
4          20

..然后只选择值为 20 的行,所以输出应该是这样的:

object_id  term_taxonomy_id
1          20
4          20

我希望我努力实现的目标是可能的。

【问题讨论】:

    标签: mysql wordpress select woocommerce conditional


    【解决方案1】:

    是的,可以使用 exists 子查询来检查分类学 id = 10 的对象:

    select t1.object_id, t1.term_taxonomy_id
    from yourtable t1
    where t1.term_taxonomy_id=20
        and exists (select 1
                    from yourtable t2
                    where t2.term_taxonomy_id=10 and t2.object_id=t1.object_id)
    

    您可以使用自联接或in() 子查询,但由于不需要第二次获取数据,exists 通常更快。

    【讨论】:

      【解决方案2】:

      这将选择重复的行:

      SELECT
          object_id, term_taxonomy_id, COUNT(*)
      FROM
          YOUR_TABLE_NAME
      GROUP BY
          object_id, term_taxonomy_id
      HAVING 
          COUNT(*) > 1
      

      【讨论】:

        【解决方案3】:

        另一种过滤方法是通过加入:

        SELECT t.object_id, t.term_taxonomy_id
        FROM yourtable t
            INNER JOIN yourtable t1 
                ON t.object_id = t1.object_id
                AND t1.term_taxonomy_id = 10
        WHERE t.term_taxonomy_id = 20
        

        这可以让您避免由 Shadow 答案中的 exists 子句引起的多次选择(不过,这在语义上是完全正确的)。

        【讨论】:

        • exists 子查询在很多情况下都比连接快,因为 exists 子查询不获取任何数据,而您需要在连接中获取两次数据。
        • Yuri 也感谢您的回答,您的解决方案也很有效,只是比 Shadow 的慢一点 :)
        • 对,在庞大的数据量上比较两者会很有趣
        猜你喜欢
        • 2018-12-06
        • 1970-01-01
        • 2021-03-22
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2016-12-25
        相关资源
        最近更新 更多