 |
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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|