sql >> Databáze >  >> RDS >> Mysql

MySQL Počet produktů ze všech podkategorií

Kdybych to byl já, vytvořil bych ULOŽENÝ POSTUP. Druhou možností je procházet s PHP přes první dotaz a pak pro každé ID spustit další dotaz – ale tento druh logiky může vaši stránku drasticky zpomalit.

Zde je pěkný návod na uložené procedury:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

V zásadě spouštíte stejné smyčky, které jsem zmínil výše, jako s PHP (ale běží mnohem rychleji). Procedura je uložena v databázi a lze ji volat jako funkci. Výsledek je stejný jako u dotazu.

Jak bylo požadováno, zde je ukázkový postup (nebo spíše používá dva), v mém případě „ags_orgs“ funguje podobně jako vaše kategorie, kde je parentOrgID. "getChildOrgs" také funguje jako nadbytečná funkce, protože jsem neměl ponětí, o kolik úrovní níže musím jít (toto bylo napsáno pro MSSQL - pravděpodobně existují rozdíly s mySQL) Bohužel to nepočítá řádky, spíše získává data . Vřele doporučuji následovat jeden nebo dva tutoriály, abyste lépe pochopili, jak to funguje:

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

Což je nazýváno tímto procesem:

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. Jak se mohu vyhnout příliš dlouhým chybám s nezpracovanými proměnnými délkami v SQL Developer?

  2. Náhodná hodnota pro sloupec DATETIME

  3. PHPExcel a zalamování textu

  4. Procházet předdefinovanými hodnotami