2014-02-19 35 views
2

我怎樣才能把這個大的查詢到存儲過程中和要這樣呢?好處是什麼?如何打開這個大查詢到存儲過程中

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,所以我的一個朋友告訴我,我也許應該考慮使用存儲過程

+0

你從其他表中想要的東西列? –

+0

所有來自項目的列和所有來自類別/子類別 –

回答

2

如果你想從品牌和項目,表列而已,你可以像下面

"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

+0

的這些列將從項目,類別,子類別返回*嗎? –

+0

感謝您的編輯。如果我需要從多個表中越來越多的東西,是好堅持下去這樣或者我應該使用存儲過程(這似乎是一個可怕的概念) –

+0

用於從表中獲取的所有列你'表名。*' –

1

以我的經驗,存儲過程已經更多的麻煩比他們的價值,不夠靈活,因此更難以維持比內聯SQL,居住以外的版本控制,並不能提供太多,如果任何性能效益。在這種情況下,存儲的例程似乎不是必需的或有益的,因爲您的查詢不需要高級功能,例如光標。有關優點和缺點的另一個討論,請參閱this post

+2

的parises我不同意 - 這主要是因爲有絕對沒有理由的存儲過程應該是*以外的版本控制* - 如果它是,它只是你自己的懶惰.... –

+0

@marc_s你會說的MySQL存儲程序,版本控制是比較容易或比應用程序代碼版本控制更難? - 我發現它是更具挑戰性,特別是資源有限。另外,如何處理我的整個答案,即其他問題?最後,關於「懶惰」的問題,你的語法和標點是非常殘酷的。 –

+1

正如我所說 - 我不同意 - 基本上,你說的一切。我沒有看到版本控制對於存儲過程(以及數據庫中的任何東西)比源代碼更難,我不同意你所做的不靈活和更難以維護的陳述。並且對於我的語法感到抱歉 - 英文是**不是**我的第一語言 –

0
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 
+0

所以我用這個代替了SQL,並且不做其他更改? –

+0

好的。它的工作? 。 –