PDA

View Full Version : کوئری مناسب برای جدول بخش و زیر بخش



pary_daryayi
دوشنبه 18 فروردین 1393, 08:49 صبح
من یک جدول دارم که ضمیمه کردم( pic1 )
اونهایی که parent_id = 0 دارند بخش اصلی هستند و اونهایی که parent_id != 0 دارند زیر بخش هستند .
میخوام خروجی این جدول مثل تصویر 2 که ضمیمه شده دربیاد ( pic2 )
با دو کوئری و while تو در تو این رو ایجاد کردم : (زیر بخش های هر بخش در پایین اون بخش قرار میگیره)

کوئری اول :


$qry="SELECT * FROM (`m_section`) WHERE `parent_id`=0";
کوئری دوم


$qry1="select * from m_section where parent_id=$id ";

میخوام با یک کوئری اینو ایجاد کنم , ممنون میشم راهنمایی کنید .

us1234
دوشنبه 18 فروردین 1393, 12:37 عصر
SELECT count(parent_id) , title from m_section where parent_id != 0 GROUP BY parent_id

مهرداد سیف زاده
دوشنبه 18 فروردین 1393, 13:19 عصر
اگر خزوجی شما به شکل همین table هست و به هر کدوم از tr های table رنگ خاصی رو با از طریق class بهش دادید کار راحته. در ابتدا یک کوئیری بزنید و بعد درون حلقه تکرار شرط بزارید اگر فیلد parent_id=0 بود اون وقت tr با کلاس رنگ سیاه در غیر این صورت به رنگ آبی



$qry="SELECT * FROM (`m_section`)";$send = '';while ($v = $qry) { if($v['parent_id'] == '0') { $send .= "<tr class='black'><td>{$v['id']}</td><td>{$v['title']}</td></tr>"; }else{ $send .= "<tr class='red'><td>{$v['id']}</td><td>{$v['title']}</td></tr>"; }}

البته دستورات mysql رو دقیق ننوشتم و بیشتر مفهومی نوشتم

***BiDaK***
دوشنبه 18 فروردین 1393, 15:54 عصر
جدولی که مد نظرته با استفاده از بازگشتی:

function categoryList($parent){
static $counter = 1;
$result = mysql_query("select * from category where parent_id=$parent");
if (mysql_num_rows($result) > 0)
{
while ($row = mysql_fetch_assoc($result))
{
echo "<tr><td>".($row['parent_id'] == 0? $counter++ : '')."</td>";
echo "<td>". $row['name']."</td></tr>";
categoryList($row['id']);
}
}
}


echo "<table border='1'><tr><td>ردیف</td><td>عناون</td></tr>";
categoryList(0);
echo "</table>";

engmmrj
دوشنبه 18 فروردین 1393, 18:02 عصر
از کلاس آقای کرامتی فر استفاده کنید ، ایشون با یک query پیداه کرده اند .
لینک (http://www.phpclasses.org/browse/package/7040/download/zip.html)

pary_daryayi
دوشنبه 18 فروردین 1393, 18:32 عصر
@us1234: این کوئری خروجیش با تصویر 2 یکی نیست .
@ مهرداد 66 : من با دو کوئری نوشته بودم و خروجی درست بود , میخواستم با یک کوئری بنویسم .
@ bidak : خیلی ممنونم , نتیجه داد . تقریبا اینو میخواستم .
@ engmmrj : ممنون

engmmrj
دوشنبه 18 فروردین 1393, 18:34 عصر
جدولی که مد نظرته با استفاده از بازگشتی:

function categoryList($parent){
static $counter = 1;
$result = mysql_query("select * from category where parent_id=$parent");
if (mysql_num_rows($result) > 0)
{
while ($row = mysql_fetch_assoc($result))
{
echo "<tr><td>".($row['parent_id'] == 0? $counter++ : '')."</td>";
echo "<td>". $row['name']."</td></tr>";
categoryList($row['id']);
}
}
}


echo "<table border='1'><tr><td>ردیف</td><td>عناون</td></tr>";
categoryList(0);
echo "</table>";

اصلا بهینه نیست برای هر parent یک query اجرا میشه !

***BiDaK***
دوشنبه 18 فروردین 1393, 19:17 عصر
اول این کدو نوشتم:

function categoryList($parent, $array)
{
static $counter = 1;
foreach ($array as $value)
{
if ($value['parent'] == $parent)
{
echo "<tr><td>".($value['parent'] == 0? $counter++ : '')."</td>";
echo "<td>". $value['name']."</td></tr>";
categoryList($value['id'], $array);
}
}
}

$result = mysql_query("select * from category");
while ($row = mysql_fetch_assoc($result))
{
$array[$row['id']] = array('id'=>$row['id'], 'name'=>$row['name'], 'parent'=>$row['parent']);
}
echo "<table border='1'><tr><td>ردیف</td><td>عناون</td></tr>";
categoryList(0, $array);
echo "</table>";


تکرار خیلی زیاد بود به اون شکل نوشتم.

shpegah
سه شنبه 19 فروردین 1393, 21:15 عصر
select parent_id,(case when parent_id=0 then id else parent_id end) as idn,title from m_section order by idn

کافیه وقتی به کانترتون اضافه کنید که parent_id صفره

engmmrj
سه شنبه 16 اردیبهشت 1393, 15:47 عصر
چطوری میشه وقتی پخش اصلی رو پاک کرد زیر شاخه های اون هام پاک بشه ؟

cpuram
سه شنبه 16 اردیبهشت 1393, 16:11 عصر
چطوری میشه وقتی پخش اصلی رو پاک کرد زیر شاخه های اون هام پاک بشه ؟

باید ارتباط جدول با خودش به صورت cascade بشه.

engmmrj
سه شنبه 16 اردیبهشت 1393, 16:31 عصر
CREATE TABLE `wo_menu` (
`id` INT PRIMARY KEY AUTO_INCREMENT,
`title` varchar(100) NOT NULL ,
`url` varchar(100) NOT NULL,
`parent_id` INT NULL,
FOREIGN KEY (`parent_id`) REFERENCES `wo_menu` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB
به صورت بالا عمل کردم ولی موقع insert اررو میده


QL statement: SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wonderco`.`wo_menu`, CONSTRAINT `wo_menu_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `wo_menu` (`id`) ON DELETE CASCADE). The SQL statement executed was: INSERT INTO `wo_menu` (`parent_id`, `title`, `url`) VALUES (:yp0, :yp1, :yp2)

engmmrj
سه شنبه 16 اردیبهشت 1393, 16:42 عصر
الان مشکل اینجاست که هر منوی که میخوام اظافه کنم باید parent_id تو id باید باشه مثلا من بخوام parent_id 0 بدم اررو میده

shpegah
سه شنبه 16 اردیبهشت 1393, 17:13 عصر
شما اگر میخواهید از کلید خارجی استفاده کنید باید دوتاجدول داشته باشید نه یکی ! کلید اصلی یک جدول باید به کلید خارجی در جدول دوم وصل شود وخاصیت cascade هم اعمال شود وگرنه کلید خارجی نمیتواند در داخل همان تیبل باشد

beh3000
سه شنبه 16 اردیبهشت 1393, 19:01 عصر
سلام بهترین کوئری (بهینه ترین ) برای نمایش پست ها و کامنت پست ها چیه ؟ یعنی مثلا 10 مطلب آخر بانک رو نمایش بده و کامنتهای هر پیت رو هم در زیر هر پست لیست کنه . من الان با یک کوئری 10 پست آخر رو میگیرم و داخل foreach به ازای پست به جدول کامنت select میزنم ولی میخواستم بهینه بنویسم لطفا راهنمائیم کنید ... مرسی

cpuram
سه شنبه 16 اردیبهشت 1393, 19:16 عصر
سلام بهترین کوئری (بهینه ترین ) برای نمایش پست ها و کامنت پست ها چیه ؟ یعنی مثلا 10 مطلب آخر بانک رو نمایش بده و کامنتهای هر پیت رو هم در زیر هر پست لیست کنه . من الان با یک کوئری 10 پست آخر رو میگیرم و داخل foreach به ازای پست به جدول کامنت select میزنم ولی میخواستم بهینه بنویسم لطفا راهنمائیم کنید ... مرسی

لطفا سوالتونو توی تاپیک جدید بپرسید.

engmmrj
سه شنبه 16 اردیبهشت 1393, 19:31 عصر
شما اگر میخواهید از کلید خارجی استفاده کنید باید دوتاجدول داشته باشید نه یکی ! کلید اصلی یک جدول باید به کلید خارجی در جدول دوم وصل شود وخاصیت cascade هم اعمال شود وگرنه کلید خارجی نمیتواند در داخل همان تیبل باشد
خوب الان من میخوام وقتی سر شاخه پاک شد زیر شاخه اون ها هم پاک بشه باید چیکار کنم ؟ راه حل چیه ؟

beh3000
سه شنبه 16 اردیبهشت 1393, 20:01 عصر
چون یک مقدار شبیه این کوئری دوستمون بود مطرح کردم ... ولی بازم چشم توی تاپیک جدید مطرح میکنم

shpegah
سه شنبه 16 اردیبهشت 1393, 20:12 عصر
خوب الان من میخوام وقتی سر شاخه پاک شد زیر شاخه اون ها هم پاک بشه باید چیکار کنم ؟ راه حل چیه ؟
شما باید سرشاخه را در یک تیبل وزیرشاخه هارا در یک تیبل دیگر بریزید سپس کلید اصلی جدول اول را به کلید خارجی جدول دوم با خاصیت cascade وصل کنید حالا اگر از جدول اول هر رکوردی را حذف کنید تمام زیر شاخه هایش در جدول دوم خودکار حذف میشود