代码之家  ›  专栏  ›  技术社区  ›  KayakinKoder

如何提取重复的代码。。。可能是存储函数?

sql
  •  3
  • KayakinKoder  · 技术社区  · 8 年前

    这些语句的第三行完全相同:

    声明1

    SELECT * FROM `uploads`
    WHERE `uid` = :uid
    AND `deleted` <> 1  AND `archived` <> 1
    

    声明2

    SELECT * FROM `uploads`
    WHERE `folder_id` = :folder_id
    AND `deleted` <> 1  AND `archived` <> 1
    

    第三行也用于许多其他语句,比如说30个不同的语句;在这个人为的例子中,它意味着“我们从上传表中获取所有未被删除或存档的文件”。如果将来需要添加第三个限定符(例如。 AND uploadsuccess = 1 )我们必须编辑30个不同的sql语句。一点也不干。我们如何在这里通过SQL使用DRY原则(在我们的例子中,如果这是一个重要因素,那么MySQL)?

    谢谢你的帮助。

    2 回复  |  直到 8 年前
        1
  •  3
  •   Bill Karwin    8 年前

    我建议使用视图:

    CREATE OR REPLACE VIEW uploads_current AS
      SELECT * FROM `uploads
      WHERE `deleted` <> 1 AND `archived` <> 1;
    

    然后您可以使用其他条件进行查询:

      SELECT * FROM `uploads_current`
      WHERE `uid` = :uid;
    

    以后可以重新定义视图:

    CREATE OR REPLACE VIEW uploads_current AS
      SELECT * FROM `uploads
      WHERE `deleted` <> 1 AND `archived` <> 1 AND uploadsuccess = 1;
    

    然后,查询uploads\u current的所有代码都将隐式包含相同的条件,无需更改代码。

    了解有关视图的更多信息: https://dev.mysql.com/doc/refman/5.7/en/create-view.html

        2
  •  3
  •   e_i_pi    8 年前

    这是一个常见的问题,我们希望存储所有数据,但99%的情况下,我们会过滤掉某个数据子集。

    我通常使用的解决方案是使用中的逻辑创建一个视图,然后对其进行查询。例如:

    CREATE VIEW `uploads_view` AS
    SELECT * FROM `uploads`
    WHERE `deleted` <> 1
    AND `archived` <> `;
    
    SELECT * FROM `uploads_view` WHERE `uid` = :uid;
    
    SELECT * FROM `uploads_view` WHERE `folder_id` = :folder_id