Если бы это было мне, я бы создать хранимую процедуру. Другим вариантом является цикл с PHP через первый запрос, тогда для каждого идентификатора запускается другой запрос - но такая логика может резко замедлить вашу страницу.
Вот хороший учебник по хранимым процедурам: 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
вы можете создать SQL скрипку с данными и структурой для этих таблиц http://sqlfiddle.com/? – Maximus2012
Adjacency List Model - это анти-шаблон SQL, читаемый о таблицах Closere и реализующий это, также проанализируйте это http://www.slideshare.net/billkarwin/models-for-hierarchical-data –
Я не вижу ни одной колонки, которая определит подкатегорию , Или я ничего не вижу? –