Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Produtos MySQL Count de todas as subcategorias


Se fosse eu criaria um STORED PROCEDURE. A outra opção é fazer um loop com o PHP através da primeira consulta e, em seguida, para cada ID, execute outra consulta - mas esse tipo de lógica pode diminuir drasticamente a velocidade da sua página.

Aqui está um bom tutorial sobre procedimentos armazenados:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Basicamente você executa os mesmos loops que mencionei acima que você faria com o PHP (mas ele roda muito mais rápido). O procedimento é armazenado no banco de dados e pode ser chamado como uma função. O resultado é o mesmo que uma consulta.

Conforme solicitado, aqui está um procedimento de amostra (ou melhor, ele usa dois) na minha instância, "ags_orgs" atua de maneira semelhante às suas categorias onde há um parentOrgID. "getChildOrgs" também age como uma função redundante, já que eu não tinha ideia de quantos níveis eu tinha que descer (isso foi escrito para MSSQL - provavelmente há diferenças com mySQL) Infelizmente, isso não conta linhas, mas obtém dados . Eu recomendo seguir um tutorial ou dois para entender melhor como funciona:
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

Que é chamado por este 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