Sql 如何将这个大查询转换为存储过程

Sql 如何将这个大查询转换为存储过程,sql,stored-procedures,Sql,Stored Procedures,如何将这个大查询转换为存储过程?我应该这样做吗?有什么好处 从品牌表中,我只需要品牌名称 从places表中,我只需要place\u名称 我现在正在做的事情,我得到了所有的栏目,从品牌>代码>代码>位置>代码>,所以我的一个朋友告诉我,我应该考虑使用存储过程,如果你只想从品牌和项目表中选择列,你可以像下面的一样做。 "SELECT brands.brand_name,places.place_name, user_items.*,items.*,item_catego

如何将这个大查询转换为存储过程?我应该这样做吗?有什么好处

  • 品牌
    表中,我只需要
    品牌名称
  • places
    表中,我只需要
    place\u名称

我现在正在做的事情,我得到了所有的栏目,从<代码>品牌>代码>代码>位置>代码>,所以我的一个朋友告诉我,我应该考虑使用存储过程

,如果你只想从品牌和项目表中选择列,你可以像下面的

一样做。
"SELECT   brands.brand_name,places.place_name,
          user_items.*,items.*,item_categories .*,
          item_subcategories.*,item_photos.*,place_items.*
 FROM user_items
          LEFT JOIN items ON (items.item_id = user_items.item_id) 
          INNER JOIN item_categories ON (item_categories.item_id = items.item_id)
          INNER JOIN item_subcategories ON (item_subcategories.item_id = items.item_id)
          INNER JOIN brands ON (brands.brand_id = items.item_brand)
          INNER JOIN item_photos ON (item_photos.item_id = items.item_id)

          INNER JOIN place_items ON (place_items.item_id = items.item_id)
          INNER JOIN places ON (places.place_id = place_items.place_id)

          WHERE user_items.user_id = :user_id"
存储过程的用途是重用一组SQL语句。存储过程的性能将和它包含的SQL语句一样好

提高代码可读性的更好方法是对表名使用别名


如果您只需要品牌和项目表中的列,可以执行以下操作

"SELECT   brands.brand_name,places.place_name,
          user_items.*,items.*,item_categories .*,
          item_subcategories.*,item_photos.*,place_items.*
 FROM user_items
          LEFT JOIN items ON (items.item_id = user_items.item_id) 
          INNER JOIN item_categories ON (item_categories.item_id = items.item_id)
          INNER JOIN item_subcategories ON (item_subcategories.item_id = items.item_id)
          INNER JOIN brands ON (brands.brand_id = items.item_brand)
          INNER JOIN item_photos ON (item_photos.item_id = items.item_id)

          INNER JOIN place_items ON (place_items.item_id = items.item_id)
          INNER JOIN places ON (places.place_id = place_items.place_id)

          WHERE user_items.user_id = :user_id"
存储过程的用途是重用一组SQL语句。存储过程的性能将和它包含的SQL语句一样好

提高代码可读性的更好方法是对表名使用别名



根据我的经验,存储过程遇到的麻烦比它们的价值还多,不灵活,因此比内联SQL更难维护,驻留在版本控制之外,并且无法提供很多性能好处。在这种情况下,存储例程似乎没有必要或没有好处,因为您的查询不需要高级功能,例如游标。有关优缺点的另一个讨论,请参见。

根据我的经验,存储过程的麻烦比它们的价值更大,它不灵活,因此比内联SQL更难维护,不受版本控制,而且无法提供很多性能好处。在这种情况下,存储例程似乎没有必要或没有好处,因为您的查询不需要高级功能,例如游标。有关优缺点的另一讨论,请参见。

您希望从其他表中获得哪些列?项目中的所有列以及类别/子类别中的所有列?您希望从其他表中获得哪些列?项目中的所有列以及类别/子类别中的所有列将返回*项目、类别、子类别?谢谢您的编辑。如果我需要从更多的表中获取越来越多的内容,继续这样做可以吗?还是应该使用存储过程(这似乎是一个可怕的概念)来获取表中的所有列呢。。。它只是一个一个或多个SQL语句集合的名称。lolz..一点也不像那个家伙。。。alias使您的代码更易于阅读,您的同事会将您分为几组进行编写。这将从项目、类别、子类别中返回*?感谢您的编辑。如果我需要从更多的表中获取越来越多的内容,继续这样做可以吗?还是应该使用存储过程(这似乎是一个可怕的概念)来获取表中的所有列呢。。。它只是一个一个或多个SQL语句集合的名称。lolz..一点也不像那个家伙。。。alias使您的代码更易于阅读,您的同事们会对您提出异议,我不同意,主要是因为存储过程完全没有理由不受版本控制,这只是你自己的懒惰…@marc_s你认为MySQL存储过程的版本控制比应用程序代码的版本控制更容易还是更难?——我发现它更具挑战性,尤其是在资源有限的情况下。另外,我的回答的全部内容,即其他几点如何?最后,关于“懒惰”这个话题,你的语法和标点符号太糟糕了。正如我所说——我不同意——基本上你所说的一切。我不认为存储过程(以及数据库中的任何内容)的版本控制比源代码更难,我不同意您所说的不灵活和更难维护。对于我的语法我很抱歉-英语不是我的第一语言我不同意-主要是因为存储过程绝对没有理由应该在版本控制之外-如果是的话,这只是你自己的懒惰…@marc_s你认为MySQL存储过程的版本控制比应用程序代码的版本控制更容易还是更难?——我发现它更具挑战性,尤其是在资源有限的情况下。另外,我的回答的全部内容,即其他几点如何?最后,关于“懒惰”这个话题,你的语法和标点符号太糟糕了。正如我所说——我不同意——基本上你所说的一切。我不认为存储过程(以及数据库中的任何内容)的版本控制比源代码更难,我不同意您所说的不灵活和更难维护。对不起,我的语法-英语不是我的第一语言,所以我用这个代替SQL,并没有做其他的改变?所以我用这个代替SQL,并没有做其他的改变?
    DELIMITER $$
    DROP PROCEDURE IF EXISTS `ABC` $$
    CREATE PROCEDURE `ABC`(IN UID LONG)
    READS SQL DATA
    BEGIN
    SELECT * 
    FROM user_items
    LEFT JOIN items ON (items.item_id = user_items.item_id) 
    INNER JOIN item_categories ON (item_categories.item_id = items.item_id)
    INNER JOIN item_subcategories ON (item_subcategories.item_id = items.item_id)
    INNER JOIN brands ON (brands.brand_id = items.item_brand)
    INNER JOIN item_photos ON (item_photos.item_id = items.item_id)
    INNER JOIN place_items ON (place_items.item_id = items.item_id)
    INNER JOIN places ON (places.place_id = place_items.place_id)
    WHERE user_items.user_id = UID
    END $$
    DELIMITER ;



you can do like this and execute this and can call then :-

CALL ABC(1234);

where 1234 is user_id of user. Thank you