Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL Đếm sản phẩm từ tất cả các danh mục con

Nếu là tôi, tôi sẽ tạo một THỦ TỤC ĐƯỢC LƯU TRỮ. Tùy chọn khác là lặp lại với PHP thông qua truy vấn đầu tiên, sau đó đối với mỗi ID, hãy chạy một truy vấn khác - nhưng loại logic này có thể làm chậm trang của bạn một cách đáng kể.

Đây là một hướng dẫn hay về các thủ tục được lưu trữ: http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Về cơ bản, bạn chạy các vòng lặp giống như tôi đã đề cập ở trên, bạn sẽ làm với PHP (nhưng nó chạy nhanh hơn nhiều). Thủ tục được lưu trữ trong cơ sở dữ liệu và có thể được gọi giống như một hàm. Kết quả giống như một truy vấn.

Theo yêu cầu, đây là một quy trình mẫu (hay đúng hơn là nó sử dụng hai) trong trường hợp của tôi, "ags_orgs" hoạt động theo cách tương tự với các danh mục của bạn trong đó có parentOrgID. "getChildOrgs" cũng hoạt động giống như một hàm dự phòng vì tôi không biết mình phải xuống bao nhiêu cấp (điều này được viết cho MSSQL - có lẽ có sự khác biệt với mySQL) Thật không may, điều này không tính hàng, thay vào đó nó lấy dữ liệu . Tôi thực sự khuyên bạn nên làm theo một hoặc hai hướng dẫn để hiểu rõ hơn về cách hoạt động của nó:

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

Cái được gọi bởi proc này:

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. Làm thế nào để lưu trữ số thập phân trong MySQL?

  2. Sự khác biệt giữa Mã hóa và đối chiếu?

  3. Cách lấy tên tháng ngắn từ ngày trong MySQL

  4. Làm thế nào để đảo ngược thứ tự của các ký tự trong một chuỗi trong MySQL

  5. PHP Caching - Lưu trong cơ sở dữ liệu hoặc tạo tệp có nhanh hơn không?