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
Load balance : Server 02