Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Produkty MySQL Count ze wszystkich podkategorii

Gdybym to był ja, utworzyłbym PROCEDURĘ PRZECHOWYWANIA. Inną opcją jest pętla z PHP przez pierwsze zapytanie, a następnie dla każdego identyfikatora uruchamianie innego zapytania - ale tego rodzaju logika może drastycznie spowolnić twoją stronę.

Oto fajny samouczek dotyczący procedur składowanych:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

Zasadniczo uruchamiasz te same pętle, o których wspomniałem powyżej, co w PHP (ale działa znacznie szybciej). Procedura jest przechowywana w bazie danych i może być wywołana jak funkcja. Wynik jest taki sam jak zapytanie.

Zgodnie z żądaniem, oto przykładowa procedura (a raczej używa dwóch) w moim przypadku, „ags_orgs” działa podobnie do kategorii, w których istnieje parentOrgID. "getChildOrgs" działa również trochę jak funkcja nadmiarowa, ponieważ nie miałem pojęcia, ile poziomów w dół muszę przejść (to zostało napisane dla MSSQL - prawdopodobnie są różnice z mySQL) Niestety to nie liczy wierszy, raczej pobiera dane . Gorąco polecam skorzystanie z samouczka lub dwóch, aby lepiej zrozumieć, jak to działa:

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

Który jest wywoływany przez ten proces:

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. Przestaw wiersz MySQL na dynamiczną liczbę kolumn

  2. Prześlij wiele plików w PHP i wstaw ścieżkę do MySQL

  3. Nie można połączyć się z bazą danych MySQL w aplikacji wdrożonej w CloudBees

  4. wygeneruj klauzulę where w bash za pomocą zmiennych

  5. Jak sprawić, by wiele LEFT JOIN z OR w pełni wykorzystywało indeks złożony?