sql >> データベース >  >> RDS >> Mysql

MySQLはすべてのサブカテゴリから製品をカウントします

    私の場合は、ストアドプロシージャを作成します。もう1つのオプションは、最初のクエリをPHPでループしてから、IDごとに別のクエリを実行することです。ただし、この種のロジックを使用すると、ページの速度が大幅に低下する可能性があります。

    ストアドプロシージャに関する優れたチュートリアルは次のとおりです。 http://net。 tutsplus.com/tutorials/an-introduction-to-stored-procedures/

    基本的に、PHPを使用する場合と同じループを実行します(ただし、実行速度ははるかに速くなります)。プロシージャはデータベースに保存され、関数のように呼び出すことができます。結果はクエリと同じです。

    要求に応じて、これが私のインスタンスのサンプル手順です(つまり、2つ使用します)。「ags_orgs」は、parentOrgIDがあるカテゴリと同じように機能します。 「getChildOrgs」は、いくつのレベルを下げる必要があるかわからなかったため、冗長関数のようにも機能します(これは、MSSQL用に作成されたものです。mySQLとはおそらく違いがあります)。残念ながら、これは行をカウントせず、データを取得します。 。チュートリアルを1、2回実行して、その仕組みをよりよく理解することを強くお勧めします。

    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
    

    これはこの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. SQLServer-パラメータスニッフィング

    2. SQLフォーマット標準

    3. PHPで動的URLを作成するにはどうすればよいですか?

    4. OracleDBからMariaDBに移行する方法