How to create a SELECT statement for this case

Discussion in 'Databases' started by zealus, Feb 4, 2009.

  1. #1
    Imagine you have an online store. The depth of subcategories isn't limited, so you may get some items pretty close to the top and some all the way at the bottom. You want to display breadcrumbs, something like:

    Root->Category1->SubCategory2->SubCategory3->Item256
    Root->Category4->SubCategory5->SubCategory6->SubCategory7->SubCategory8 ->Item789

    You have a table that stores your items, something like:
    tblItems(
    itemID longint,
    itemName varchar(100),
    parentCategory longint)

    You have table for categories:
    tblCategories(
    catID longint,
    catName varchar(100),
    catParent longint)

    If catParent = 0 it's a root category.

    Question is - what's the most efficient way to build a SELECT query (or stored procedure, or - whatever you think is good) to get a full breadcrumb path out of database.
    The only restriction - it must be solved on the side of the database, not in some code.

    Any ideas? My dev teammates already puzzled, so I am bringing this here :)
     
    zealus, Feb 4, 2009 IP
  2. chisara

    chisara Peon

    Messages:
    141
    Likes Received:
    11
    Best Answers:
    0
    Trophy Points:
    0
    #2
    Synthesize the breadcrumb html once and store it as a field in the categories table, that would be the most efficient way to query it.
     
    chisara, Feb 5, 2009 IP
  3. zealus

    zealus Active Member

    Messages:
    70
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    93
    #3
    Right, but how do you build it in the first place?
     
    zealus, Feb 5, 2009 IP
  4. gnp

    gnp Peon

    Messages:
    137
    Likes Received:
    11
    Best Answers:
    0
    Trophy Points:
    0
    #4
    The concept behind what you ask is recursion.

    In ms sql server a scalar-valued function would do the trick ..

    
    USE [wikipedia]
    GO
    /****** Object:  UserDefinedFunction [dbo].[bread]    Script Date: 02/14/2009 17:40:05 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    -- Author:		Name
    -- Create date: 
    -- Description:	
    -- =============================================
    CREATE FUNCTION [dbo].[bread] 
    (
    	-- Add the parameters for the function here
    	@p1 smallint
    )
    RETURNS nvarchar(max)
    AS
    BEGIN
    	-- Declare the return variable here
    	DECLARE @Result nvarchar(max)
    
    	-- Add the T-SQL statements to compute the return value here
    	SELECT @Result = 
    		CASE
    			WHEN parent = 0 THEN title
    			ELSE dbo.bread(parent) + ' / ' + title
    		END
    	FROM test
    	WHERE id = @p1
    	-- Return the result of the function
    	RETURN @Result
    
    END
    
    Code (markup):
    hope this gets you started on the right course ..
     
    gnp, Feb 14, 2009 IP