अगर यह मैं होता तो मैं एक संग्रहित प्रक्रिया बना देता। दूसरा विकल्प पहली क्वेरी के माध्यम से PHP के साथ लूप करना है, फिर प्रत्येक आईडी के लिए एक और क्वेरी चलाएं - लेकिन इस तरह का तर्क आपके पेज को काफी धीमा कर सकता है।
यहाँ संग्रहित प्रक्रियाओं पर एक अच्छा ट्यूटोरियल है:http://net। tutsplus.com/tutorials/an-introduction-to-stored-procedures/
मूल रूप से आप वही लूप चलाते हैं जिनका मैंने ऊपर उल्लेख किया है जो आप PHP के साथ करेंगे (लेकिन यह बहुत तेज़ चलता है)। प्रक्रिया को डेटाबेस में संग्रहीत किया जाता है और इसे फ़ंक्शन की तरह कहा जा सकता है। परिणाम एक प्रश्न के समान है।
जैसा अनुरोध किया गया है, मेरे उदाहरण में यहां एक नमूना प्रक्रिया है (या बल्कि, यह दो का उपयोग करती है), "ags_orgs" आपकी श्रेणियों के समान तरीके से कार्य करता है जहां एक parentOrgID है। "getChildOrgs" भी एक अनावश्यक कार्य की तरह कार्य करता है क्योंकि मुझे नहीं पता था कि मुझे कितने स्तर नीचे जाना है (यह एमएसएसक्यूएल के लिए लिखा गया था - शायद mySQL के साथ मतभेद हैं) दुर्भाग्य से यह पंक्तियों की गणना नहीं करता है, बल्कि यह डेटा प्राप्त करता है . यह कैसे काम करता है इस पर बेहतर पकड़ पाने के लिए मैं एक या दो ट्यूटोरियल का अनुसरण करने की अत्यधिक अनुशंसा करता हूं:
USE [dbname]
GO
/****** Object: StoredProcedure [dbo].[getChildOrgs] Script Date: 09/26/2012 15:30:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[getChildOrgs]
@myParentID int,
@isActive tinyint = NULL
AS
BEGIN
SET NOCOUNT ON
DECLARE @orgID int, @orgName varchar(255), @level int
DECLARE cur CURSOR LOCAL FOR SELECT orgID FROM dbo.ags_orgs WHERE parentOrgID = @myParentID AND isActive = ISNULL(@isActive, isActive) ORDER BY orderNum, orgName
OPEN cur
fetch next from cur into @orgID
WHILE @@fetch_status = 0
BEGIN
INSERT INTO #temp_childOrgs SELECT orgID,orgName,description,parentOrgID,adminID,isActive,@@NESTLEVEL-1 AS level FROM dbo.ags_orgs WHERE orgID = @orgID
EXEC getChildOrgs @orgID, @isActive
-- get next result
fetch next from cur into @orgID
END
CLOSE cur
DEALLOCATE cur
END
GO
जिसे यह खरीद कहा जाता है:
USE [dbname]
GO
/****** Object: StoredProcedure [dbo].[execGetChildOrgs] Script Date: 09/26/2012 15:29:34 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[execGetChildOrgs]
@parentID int,
@isActive tinyint = NULL,
@showParent tinyint = NULL
AS
BEGIN
CREATE TABLE #temp_childOrgs
(
orgID int,
orgName varchar(255),
description text,
parentOrgID int,
adminID int,
isActive tinyint,
level int
)
-- if this isn't AGS top level (0), make the first record reflect the requested organization
IF @parentID != 0 AND @showParent = 1
BEGIN
INSERT INTO #temp_childOrgs SELECT orgID,orgName,description,parentOrgID,adminID,isActive,0 AS level FROM dbo.ags_orgs WHERE orgID = @parentID
END
exec getChildOrgs @parentID, @isActive
SELECT * FROM #temp_childOrgs
DROP TABLE #temp_childOrgs
END
GO