Ако бях аз, щях да създам ЗАПАМЕТЕНА ПРОЦЕДУРА. Другата опция е да преминете с PHP през първата заявка, след което за всеки ID да стартирате друга заявка - но този вид логика може драстично да забави страницата ви.
Ето един хубав урок за съхранени процедури:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/
По принцип изпълнявате същите цикли, които споменах по-горе, както и с PHP (но той работи много по-бързо). Процедурата се съхранява в базата данни и може да се извика като функция. Резултатът е същият като при заявка.
Както беше поискано, ето примерна процедура (или по-скоро тя използва две) в моя случай, "ags_orgs" действа по подобен начин на вашите категории, където има parentOrgID. "getChildOrgs" също действа като излишна функция, тъй като нямах представа колко нива надолу трябва да отида (това беше написано за MSSQL - вероятно има разлики с 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