Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL compte les produits de toutes les sous-catégories

Si c'était moi, je créerais une PROCÉDURE STORED. L'autre option consiste à boucler avec PHP à travers la première requête, puis pour chaque ID, exécutez une autre requête - mais ce type de logique peut ralentir considérablement votre page.

Voici un tutoriel sympa sur les procédures stockées :http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Fondamentalement, vous exécutez les mêmes boucles que j'ai mentionnées ci-dessus avec PHP (mais cela s'exécute beaucoup plus rapidement). La procédure est stockée dans la base de données et peut être appelée comme une fonction. Le résultat est le même qu'une requête.

Comme demandé, voici un exemple de procédure (ou plutôt, il en utilise deux) dans mon cas, "ags_orgs" agit de manière similaire à vos catégories où il y a un parentOrgID. "getChildOrgs" agit également un peu comme une fonction redondante puisque je n'avais aucune idée du nombre de niveaux inférieurs que je devais descendre (ceci a été écrit pour MSSQL - il y a probablement des différences avec mySQL) Malheureusement, cela ne compte pas les lignes, mais plutôt il obtient des données . Je vous recommande fortement de suivre un ou deux tutoriels pour mieux comprendre comment cela fonctionne :

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

Qui est appelé par cette 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