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

MySQL Tæl produkter fra alle underkategorier

Hvis det var mig, ville jeg oprette en LAGREDE PROCEDURE. Den anden mulighed er at gå med PHP gennem den første forespørgsel, og derefter køre en anden forespørgsel for hvert ID - men denne form for logik kan bremse din side drastisk.

Her er en fin vejledning om lagrede procedurer:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Grundlæggende kører du de samme loops, som jeg nævnte ovenfor, som du ville med PHP (men det kører meget hurtigere). Proceduren er gemt i databasen og kan kaldes som en funktion. Resultatet er det samme som en forespørgsel.

Som anmodet, her er en eksempelprocedure (eller rettere, den bruger to) i mit tilfælde, "ags_orgs" fungerer på samme måde som dine kategorier, hvor der er et parentOrgID. "getChildOrgs" fungerer også lidt som en overflødig funktion, da jeg ikke havde nogen idé om, hvor mange niveauer jeg skulle ned (dette er skrevet til MSSQL - der er sikkert forskelle med mySQL) Desværre tæller dette ikke rækker, snarere får det data . Jeg anbefaler stærkt at følge en tutorial eller to for at få et bedre greb om, hvordan det virker:

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

Hvilket kaldes af denne 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


  1. Formater SQLite-resultater som JSON

  2. Vælg en to-vejs tabel i MySql

  3. Tildeling af oprettelseskatalogprivilegier i Oracle

  4. MySQL og HBase Connectivity