私の場合は、ストアドプロシージャを作成します。もう1つのオプションは、最初のクエリをPHPでループしてから、IDごとに別のクエリを実行することです。ただし、この種のロジックを使用すると、ページの速度が大幅に低下する可能性があります。
ストアドプロシージャに関する優れたチュートリアルは次のとおりです。
基本的に、PHPを使用する場合と同じループを実行します(ただし、実行速度ははるかに速くなります)。プロシージャはデータベースに保存され、関数のように呼び出すことができます。結果はクエリと同じです。
要求に応じて、これが私のインスタンスのサンプル手順です(つまり、2つ使用します)。「ags_orgs」は、parentOrgIDがあるカテゴリと同じように機能します。 「getChildOrgs」は、いくつのレベルを下げる必要があるかわからなかったため、冗長関数のようにも機能します(これは、MSSQL用に作成されたものです。mySQLとはおそらく違いがあります)。残念ながら、これは行をカウントせず、データを取得します。 。チュートリアルを1、2回実行して、その仕組みをよりよく理解することを強くお勧めします。
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
これはこのprocによって呼び出されます:
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