sql >> Databasteknik >  >> RDS >> Mysql

MySQL Räkna produkter från alla underkategorier

Om det var jag skulle jag skapa en LAGRAD PROCEDUR. Det andra alternativet är att loopa med PHP genom den första frågan och sedan köra en annan fråga för varje ID - men denna typ av logik kan sakta ner din sida drastiskt.

Här är en trevlig handledning om lagrade procedurer:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

I princip kör du samma loopar som jag nämnde ovan som du skulle med PHP (men det går mycket snabbare). Proceduren lagras i databasen och kan kallas som en funktion. Resultatet är detsamma som en fråga.

Som efterfrågat, här är ett exempel på procedur (eller snarare, den använder två) i mitt fall, "ags_orgs" fungerar på ett liknande sätt som dina kategorier där det finns ett parentOrgID. "getChildOrgs" fungerar också ungefär som en överflödig funktion eftersom jag inte hade någon aning om hur många nivåer ner jag måste gå (detta skrevs för MSSQL - det finns förmodligen skillnader med mySQL) Tyvärr räknar detta inte rader, snarare får det data . Jag rekommenderar starkt att du följer en handledning eller två för att få ett bättre grepp om hur det fungerar:

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

Som kallas av denna 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. JSON_ARRAYAGG() Funktion i Oracle

  2. Infoga flera rader i mysqli preparerade uttalande

  3. Hur man gör dynamisk pivot i oracle PL SQL

  4. PostgreSQL jämför två jsonb-objekt