sql >> Database >  >> RDS >> Mysql

MySQL Tel producten uit alle subcategorieën

Als ik het was, zou ik een OPGESLAGEN PROCEDURE maken. De andere optie is om met PHP de eerste zoekopdracht te doorlopen en vervolgens voor elke ID een andere zoekopdracht uit te voeren - maar dit soort logica kan uw pagina drastisch vertragen.

Hier is een mooie tutorial over opgeslagen procedures:http://net. tutsplus.com/tutorials/an-introduction-to-stored-procedures/

In principe voer je dezelfde loops uit die ik hierboven noemde, je zou doen met PHP (maar het werkt veel sneller). De procedure wordt opgeslagen in de database en kan worden aangeroepen als een functie. Het resultaat is hetzelfde als een zoekopdracht.

Zoals gevraagd, hier is een voorbeeldprocedure (of liever, het gebruikt er twee) in mijn geval, "ags_orgs" werkt op een vergelijkbare manier als uw categorieën waar er een parentOrgID is. "getChildOrgs" werkt ook een beetje als een overbodige functie omdat ik geen idee had hoeveel niveaus ik moest gaan (dit is geschreven voor MSSQL - er zijn waarschijnlijk verschillen met mySQL) Helaas telt dit geen rijen, maar krijgt het gegevens . Ik raad ten zeerste aan om een ​​paar tutorials te volgen om meer grip te krijgen op hoe het werkt:

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

Die wordt aangeroepen door deze procedure:

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. Databaseverbinding Verbreek altijd de verbinding bij het ontwikkelen op dezelfde pc als DB

  2. Meerdere tabellen met transactie invoegen in mysql

  3. Hoe continu iets te verwijderen dat ouder is dan de 10 newst-items van een MySQL-database (mogelijk in JPQL/JPA)

  4. Transactiereplicatie maken