Mysql
 sql >> Database >  >> RDS >> Mysql

MySQL Count prodotti di tutte le sottocategorie

Se fossi in me creerei una PROCEDURA MEMORIZZATA. L'altra opzione è eseguire il ciclo con PHP attraverso la prima query, quindi per ogni ID eseguire un'altra query, ma questo tipo di logica può rallentare drasticamente la pagina.

Ecco un bel tutorial sulle stored procedure:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Fondamentalmente esegui gli stessi loop che ho menzionato sopra che avresti con PHP (ma funziona molto più velocemente). La procedura è memorizzata nel database e può essere richiamata come una funzione. Il risultato è lo stesso di una query.

Come richiesto, ecco una procedura di esempio (o meglio, ne usa due) nella mia istanza, "ags_orgs" agisce in modo simile alle tue categorie in cui è presente un parentOrgID. "getChildOrgs" si comporta anche come una funzione ridondante poiché non avevo idea di quanti livelli dovessi scendere (questo è stato scritto per MSSQL - probabilmente ci sono differenze con mySQL) Sfortunatamente questo non conta le righe, piuttosto ottiene i dati . Consiglio vivamente di seguire uno o due tutorial per capire meglio come funziona:

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

Che viene chiamato da questo processo:

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