  | 
              
	              
	                
  
    
	 
        Query SQL สำหรับ ดึง Tree ใน งาน MLM เข้าทำไง ครับ     | 
   
  
    |   | 
   
 
 
 
              
  
          
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ถ้าโครงสร้างใหญ่ๆ จะต้องใช้ nested set model ครับ 
http://dev.mysql.com/tech-resources/articles/hierarchical-data.html 
 
แถ้ถ้าใช้ adjacency list model จะต้องใช้ php หรือ mysql stored procedure ช่วยครับ 
$r = mysql_query("SELECT Upline FROM Member WHERE MemberId = 'A5'");
$upline = mysql_result($r,0);
$dept = 0;
$a5_to_a3 = null;
while($upline != NULL){
  $dept++;
  $r = mysql_query("SELECT Upline FROM Member WHERE MemberId = '$upline'");
  $upline = mysql_result($r,0);
  if ($upline == 'A3'){
    $a5_to_a3 = $dept;
  }
}
if (is_null($a5_to_a3){
 echo 'a5 ไม่อยู่ในสายของ a3';
} else {
 echo "a5 อยู่ในชั้นที่ {$a5_to_a3} ของสายงาน a3';
}
 
 
สำหรับตารางขนาดเล็ก (รายการน้อยกว่า 5000) ใช้คลาสที่ผมเขียนนี่ทำได้ง่ายมากครับ 
แต่ถ้ารายการใหญ่ๆ เป็นหลายๆ หมื่นๆ record ก็น่าจะเต่าน่าดูเหมือนกัน   
http://cakephp.jitwitya.com/post/DragonHtmlCategory                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-16 18:39:55 | 
                        By :
                            num | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 จริง ๆ แล้ว ผมอยากได้ แค่ sql statement ครับ 
 
เป็น SQL Procuder เลย ก็ ดี ครับ                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-16 19:02:29 | 
                        By :
                            rootkit | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ถ้าตารางโครงสร้างแบบนี้ไม่สามารถใช้ sql statement เดียวในการหา path และ depth ของ node ได้ครับ 
 
stored procedure เร็วกว่า php ก็จริง แต่เขียน php สบายกว่าครับ 
เดี๋ยววันหลังจะเขียนตัวอย่าง stored function ให้ดูครับ 
ผมเพิ่งหัดเขียน stored procedure ได้ไม่นาน ต้องใช้เวลางมนานหน่อยครับ   
 
อ้อโค้ดข้างบนผิดนะครับ 
09.  if ($upline == 'A3'){ 
10.    $a5_to_a3 = $dept; 
11.  } 
จะต้องอยู่ข้างบน select แทน                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-16 21:14:00 | 
                        By :
                            num | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 พอดีเจอ bug ที่งงอยู่นานแล้ว เลยแก้ได้เร็วครับ 
 
คำสั่งในการสร้าง function ครับ 
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `between_deep`(ancestor INT,descendant INT) RETURNS INT(11)
    DETERMINISTIC
BEGIN    
    DECLARE  has_record,dept, maxdept, d_to_a INT(11) DEFAULT 0;    
    DECLARE p_id INT(11) DEFAULT 0;
    SET p_id = 0;    
    SET has_record = 0;    
    SET dept = 0;
    SET maxdept = 50;    
    SET d_to_a = -1;
    SELECT `Upline`,1 INTO p_id,has_record FROM `Member` WHERE `MemberId` = descendant;
    WHILE (has_record<>0 AND d_to_a = -1) DO      
      SET dept = dept + 1;
      IF (p_id = ancestor) THEN
         SET d_to_a = dept;         
      END IF;
      SELECT `Upline`,1 INTO p_id,has_record FROM `Member` WHERE `MemberId` = p_id LIMIT 1;
      IF dept > maxdept THEN #ป้องกันการวนซ้ำไม่รู้จบ        
        SET has_record = 0;
        SET d_to_a = -2;
      END IF; 
    END WHILE;
    RETURN d_to_a;
 END$$
DELIMITER ;
 
 
ส่วนวิธีใช้ก็ SELECT between_deep(3,5); 
สามารถใช้ใน mysql_query() ได้ตามปกติเหมือนกับ เป็น select statement ทั่วๆ ไปครับ                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-16 21:55:27 | 
                        By :
                            num | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 แก้ไขครับ เอาคำสั่ง SET has_record = 0; ไว้ข้างบนคำสั่ง SET dept = dept + 1; ด้วยครับ                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-16 22:03:48 | 
                        By :
                            num | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 แล้วเราจะเรียกใช้ stored procedure อย่างไรครับ มี code ตัวอย่างไรไหมครับ                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-17 19:58:03 | 
                        By :
                            nilas | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ตัวอย่างการสร้าง แบบง่ายๆ ครับ 
DELIMITER $$ 
CREATE 
    PROCEDURE `test`.`myfunction`(a INT, b INT) 
    BEGIN 
          SELECT a+b AS myfunction; 
    END$$ 
DELIMITER ; 
เป็นการสร้าง function 
 
เมื่อสร้าง function แล้วสามารถเรียกใช้ได้โดยใช้คำสั่ง 
call myfunction(20,30); 
 
ถ้าใน mysql ก็เรียกโดยใช้คำสั่ง 
$r = mysql_query('myfunction(20,30)'); 
echo myql_result($r,0); ครับ 
 
ถ้าใช้โปรแกรมช่วย sql client อย่างเช่น sqlyog จะมีช่วยตัว gen syntax ในการสร้าง stroed procedure ให้นิดหน่อยครับ 
 
ในหน้านี้มีลิงค์ไปยังเว็บสอนเขียนครับ 
http://cakephp.jitwitya.com/post/mysql-stored-procedure                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-17 21:16:09 | 
                        By :
                            num | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ขอบคุณครับ...                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-18 09:47:15 | 
                        By :
                            nilas | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 คุณ สุดยอด                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-19 15:31:01 | 
                        By :
                            rootkit | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ว้าววๆๆ ชอบจริงๆ ครับ                          
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-19 17:43:03 | 
                        By :
                            ohotaluy | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 ชวยอธิบาย โค๊ด หน่อย ได้มัย ครับ  
พอดีผมเขียน ด้วย MS SQL Server 2005 
 
 SELECT `Upline`,1 INTO p_id,has_record FROM `Member` WHERE `MemberId` = descendant;  
 
 
 
SELECT `Upline`,1 INTO p_id,has_record FROM `Member` WHERE `MemberId` = p_id LIMIT 1;                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-19 20:59:39 | 
                        By :
                            rootkit | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 อ่อ ผมเจอเเล้ว  
สุดยอดกว่า  
 
 
DECLARE @boss_id int 
 
SET @boss_id = 2;  
 
WITH CTE_Example (EmployeeID, FullName, BossID, Depth) 
AS 
( 
	SELECT EmployeeID, FullName, BossID, 0 AS Depth 
	FROM Employees WHERE EmployeeID = @boss_id 
	UNION ALL 
	SELECT Employees.EmployeeID, Employees.FullName, Employees.BossID, CTE_Example.Depth + 1 AS Depth FROM Employees 
	JOIN CTE_Example ON Employees.BossID = CTE_Example.EmployeeID 
) 
 
SELECT * FROM CTE_Example 
 
 
Recursive Query                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2009-08-19 21:51:24 | 
                        By :
                            rootkit | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
               
		
     
		
	  
        
             | 
            | 
            | 
             | 
         
        
             | 
                       | 
          
            
               
                 งง ครับ คือผมก็ทำโปรเจคเกี่ยวกับ MLM เหมือนกันครับ แต่ติดตรงที่การแสดงผลเป็นสายทีมลงมาอ่ะครับ  
จากโค๊ดที่คุยกันมา ผมงงอ่ะครับ ว่าเอาไปใช้งานยังไงอ่ะครับ                        
               
               | 
             
            
              
			                                
              
                
                     | 
                     | 
                     | 
                 
                
                     | 
                  
                      
                        | Date :
                            2014-09-04 15:04:07 | 
                        By :
                            kimzuhum | 
                         
                    | 
                     | 
                 
                
                     | 
                     | 
                     | 
                 
                | 
             
           
			         | 
             | 
         
        
             | 
            | 
             | 
             | 
         
          
	    
     
      		  
	
     | 
   
 
                 |