sql >> Base de Datos >  >> RDS >> Mysql

MySQL Contar productos de todas las subcategorías

Si fuera yo, crearía un PROCEDIMIENTO ALMACENADO. La otra opción es hacer un bucle con PHP a través de la primera consulta, luego, para cada ID, ejecutar otra consulta, pero este tipo de lógica puede ralentizar su página drásticamente.

Aquí hay un buen tutorial sobre procedimientos almacenados:http://net. tutsplus.com/tutorials/una-introducción-a-los-procedimientos-almacenados/

Básicamente, ejecuta los mismos bucles que mencioné anteriormente que haría con PHP (pero se ejecuta mucho más rápido). El procedimiento se almacena en la base de datos y se puede llamar como una función. El resultado es el mismo que una consulta.

Según lo solicitado, aquí hay un procedimiento de muestra (o más bien, usa dos) en mi caso, "ags_orgs" actúa de manera similar a sus categorías donde hay un parentOrgID. "getChildOrgs" también actúa como una función redundante ya que no tenía idea de cuántos niveles tenía que bajar (esto fue escrito para MSSQL; probablemente haya diferencias con mySQL) Desafortunadamente, esto no cuenta filas, sino que obtiene datos . Recomiendo encarecidamente seguir uno o dos tutoriales para comprender mejor cómo 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 es llamado por este proceso:

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