如何把这个大查询变成一个存储过程

Posted

技术标签:

【中文标题】如何把这个大查询变成一个存储过程【英文标题】:How to turn this big query into a stored procedure 【发布时间】:2014-02-19 11:19:04 【问题描述】:

我怎样才能把这个大查询变成一个存储过程我应该这样做吗?有什么好处?

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 = :user_id
来自brands 表我只需要brand_name 来自places 表我只需要place_name

我现在的做法是,我从brandsplaces 获取所有列,所以我的一个朋友告诉我,我可能应该考虑使用存储过程

【问题讨论】:

你想要其他表的哪些列? 项目中的所有列以及类别/子类别中的所有列 【参考方案1】:

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

"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 语句一样好。

提高代码可读性的更好方法是使用 ALIASES 作为表名。

When to use SQL Table Alias

【讨论】:

这会从项目、类别、子类别中返回 * 吗? 感谢您的编辑。如果我需要更多表中越来越多的东西怎么办,是继续这样下去还是应该使用存储过程(这似乎是一个可怕的概念) 从你做的表中获取所有列tableName.* 你不应该害怕存储过程:) ...它只是一个或多个 SQL 语句集合的名称。 lolz.. 不像那个哥们...别名让你的代码更容易阅读,你的程序员同事会为你唱歌【参考方案2】:

根据我的经验,存储过程带来的麻烦多于其价值,它不灵活,因此比内联 SQL 更难维护,位于版本控制之外,并且无法提供很多性能优势(如果有的话)。在这种情况下,存储例程似乎没有必要或有益,因为您的查询不需要高级功能,例如游标。有关优点和缺点的其他讨论,请参阅this post。

【讨论】:

我不同意 - 主要是因为绝对没有理由为什么存储过程应该在版本控制之外 - 如果是,那只是你自己的懒惰...... @marc_s 你是说 mysql 存储过程的版本控制比应用程序代码的版本控制更容易还是更难?--我发现它更具挑战性,尤其是在资源有限的情况下。另外,如何解决我的全部答案,即其他点?最后,关于“懒惰”这个话题,你的语法和标点很糟糕。 正如我所说的——我不同意——基本上你所说的一切。我不认为存储过程(以及数据库中的任何内容)的版本控制比源代码更难,我不同意您所做的不灵活且更难以维护 声明。对不起我的语法 - 英语不是我的第一语言【参考方案3】:
    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

【讨论】:

所以我用这个而不是 SQL,并且不做其他更改?

以上是关于如何把这个大查询变成一个存储过程的主要内容,如果未能解决你的问题,请参考以下文章

请问如何从数据库中读取一个存储过程并把查询结果生成一个xml文件(c#)

mysql存储过程如何遍历字符串的每个字符,并把每个字符转换成int(假设都是数字字符)?

jstree做动态树,json格式传输,存储过程获得datatable之类,不知道如何把datatable转换为需要的json数据格式

请教一个mysql 存储过程的问题?

mysql 存储过程中 查询语句后面的from加上变量名 怎么写

asp.net 查询大数据量(百万条以上)如何快