Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL Count-Produkte aus allen Unterkategorien

Wenn ich es wäre, würde ich eine GESPEICHERTE PROZEDUR erstellen. Die andere Möglichkeit besteht darin, mit PHP die erste Abfrage zu durchlaufen und dann für jede ID eine weitere Abfrage auszuführen - aber diese Art von Logik kann Ihre Seite drastisch verlangsamen.

Hier ist ein nettes Tutorial zu gespeicherten Prozeduren:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Grundsätzlich führen Sie die gleichen Schleifen aus, die ich oben erwähnt habe, die Sie mit PHP ausführen würden (aber es läuft viel schneller). Die Prozedur wird in der Datenbank gespeichert und kann wie eine Funktion aufgerufen werden. Das Ergebnis ist dasselbe wie bei einer Abfrage.

Wie gewünscht, hier ist ein Beispielverfahren (oder besser gesagt, es werden zwei verwendet), in meinem Fall verhält sich "ags_orgs" ähnlich wie Ihre Kategorien, in denen es eine parentOrgID gibt. "getChildOrgs" verhält sich auch irgendwie wie eine redundante Funktion, da ich keine Ahnung hatte, wie viele Ebenen nach unten ich gehen musste (dies wurde für MSSQL geschrieben - es gibt wahrscheinlich Unterschiede zu mySQL). Leider werden hier keine Zeilen gezählt, sondern Daten abgerufen . Ich empfehle dringend, ein oder zwei Tutorials zu befolgen, um besser zu verstehen, wie es funktioniert:

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

Was von dieser Prozedur aufgerufen wird:

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