Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL Брои продукти от всички подкатегории

Ако бях аз, щях да създам ЗАПАМЕТЕНА ПРОЦЕДУРА. Другата опция е да преминете с PHP през първата заявка, след което за всеки ID да стартирате друга заявка - но този вид логика може драстично да забави страницата ви.

Ето един хубав урок за съхранени процедури:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

По принцип изпълнявате същите цикли, които споменах по-горе, както и с PHP (но той работи много по-бързо). Процедурата се съхранява в базата данни и може да се извика като функция. Резултатът е същият като при заявка.

Както беше поискано, ето примерна процедура (или по-скоро тя използва две) в моя случай, "ags_orgs" действа по подобен начин на вашите категории, където има parentOrgID. "getChildOrgs" също действа като излишна функция, тъй като нямах представа колко нива надолу трябва да отида (това беше написано за MSSQL - вероятно има разлики с mySQL) За съжаление това не брои редове, а по-скоро получава данни . Силно препоръчвам да следвате един или два урока, за да разберете по-добре как работи:

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

Което се извиква от тази процедура:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL таблица за актуализиране на базата на стойност на друга таблица

  2. Django – OperationalError:(1054, неизвестна колона „xx“ в „списък с полета“)

  3. Връзка много към много INSERT

  4. Как да предам променлива към IN клауза?

  5. Дизайн на база данни за валидиране на динамично поле на формуляр