السلام عليكم ورحمة الله وبركاته
عندي مسألة في عبارة SQL صعُب علي حلها ، وهي :
عندي جدول واحد عن التصنيفات :
CREATE TABLE `topics` ( `topicid` int(6) NOT NULL auto_increment, `topicname` varchar(80) collate utf8_general_ci NOT NULL, `topicparent` int(11) NOT NULL default '0', `level` smallint(2) NOT NULL default '1', `is_visible` smallint(1) NOT NULL default '1', PRIMARY KEY (`topicid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
وفيه الحقول التالية :
INSERT INTO `topics` (`topicid`, `topicname`, `topicparent`, `level`, `is_visible`) VALUES (1, 'التفسير', 0, 1, 1), (2, 'تفسير القرآن بالمأثور', 1, 1, 1), (3, 'الصنيف الأب 2', 0, 3, 1), (4, 'التصنيف الابن 2', 3, 1, 1), (5, 'التاريخ الإسلامي', 0, 1, 0), (6, 'تاريخ الدولة العباسية', 5, 1, 1);
انظر المرفق : topics_table.gif
وفيه الحقل ( topicparent ) يشير إلى رقم التصنيف الأب للسجل الحالي . ويوضِّح أن :
التصنيف ( التفسير بالمأثور ) تابع للتصنيف ( التفسير ذو الرقم 1 ) .
التصنيف ( التصنيف الابن 2 ) تابع للتصنيف ( التصنيف الأب 2 ذو الرقم 3 ) .
التصنيف ( تاريخ الدولة العباسية ) تابع للتصنيف ( التاريخ الإسلامي ذو الرقم 5 ) .
والمطلوب التالي إنشاء VIEW يحمل المواصفات التالية :
1 - فيه الحقل [ category ] وهو اسم التصنيف الأب للسجل الحالي، وهذه وقعت على حلها أثناء كتابة السؤال .
2 - فيه الحقل [ level ] ويحمل القيمة العليا سواء كانت قيمة الحقل level للسجل الحالي أو لأحد السجلات الأصول - التصنيفات الآباء - بهدف أنا إذا خصصنا تصنيفاً بفئة أو مجموعة من المستخدمين فإنه يعمم على جميع التصنيفات الفرعية له، وينحجب هو وفروعه عن الأعضاء الآخرين الذين يحملون مستوى أقل .
3 - فيه الحقل [ is_visible ] ويحمل القيمة الأدنى سواء كانت للسجل الحالي أو لأحد سجلات الصنيفات الأصول ( الآباء ) بهدف أنّا إذا أخفينا أحد التصنيفات فستختفي جميع فروعه وفروع فروعه لأنها تحمل نفس قيمة الحقل is_visible الخاص به .
وهذا التكنيك لأجل تسهيل الإخفاء والتخصيص بدون تجشم مشقة تعديل UPDATE جميع السجلات الفرعية لتصنيف معين .
وقد حاولت إنشاء الـ VEIW ولكن دماغي يعمل hang فكانت هذه المحاولة التالية :
CREATE VIEW vwTopics AS SELECT topicid AS id, topicname AS title, topicparent AS parent, (SELECT topicname FROM topics WHERE topicid=parent) AS category, CALL getLevel(id) AS level, /* محل السؤال */ CALL getVisible(id) AS is_visible /* محل السؤال */ FROM topics WHERE (is_visible > 0);
