Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 109,027

HOME > PHP > PHP Forum > ติดปัญหาค่ะ ภารกิจเดียวกัน แต่มีผู้รับผิดชอบหลายคน อยากให้แสดงแค่แถวเดียว ต้องทำอย่างไรค่ะ



 

ติดปัญหาค่ะ ภารกิจเดียวกัน แต่มีผู้รับผิดชอบหลายคน อยากให้แสดงแค่แถวเดียว ต้องทำอย่างไรค่ะ

 



Topic : 103535



โพสกระทู้ ( 0 )
บทความ ( 0 )



สถานะออฟไลน์




DB มี 3 ตาราง ดังนี้

1. ตาราง mission
ตาราง mission

2. ตาราง officer
ตาราง officer

3. ตาราง mission_officer
 ตาราง mission_officer

โดยต้องการดึงข้อมูลจาก 3 ตาราง มาแสดง

ตอนนี้เขียนโค๊ดแล้วแสดงได้ดังรูปที่ 1 (ในกรอบสีแดงมี 2 แถว)
รูปที่ 1

แต่จริงๆ แล้วอยากให้แสดงได้ดังรูปที่ 2 (ในกรอบสีแดงมีแค่ 1 แถว)
รูปที่ 2

ไม่ทราบว่าต้องแก้โค๊ดอย่างไรคะ

ตอนนี้เขียนโค๊ดอย่างนี้ค่ะ
Code (PHP)
<?
require_once("Connect.php");
$sql_Fmission="select mission.mission_id,mission.mission,mission.statuss,
officer.officer_id,officer.officer,
mission_officer.mission_id,mission_officer.officer_id 
from mission inner join mission_officer on mission.mission_id=mission_officer.mission_id 
inner join officer on mission_officer.officer_id=officer.officer_id 
order by mission.mission_id asc";
$result_Fmission=mysql_query($sql_Fmission);
?>
<table border="0">
<tr bgcolor="#C2D69B">
<td>รหัสภารกิจ</td>
<td>ภารกิจ</td>
<td>สถานะ</td>
<td>ผู้รับผิดชอบ</td>
<td>แก้ไข</td>
<td>ลบ</td>
</tr>
<?
while($rows_Fmission=mysql_fetch_array($result_Fmission))
{
?>
<tr bgcolor="#EAF1DD">
<td><? echo $rows_Fmission['mission_id']; ?></td>
<td><? echo $rows_Fmission['mission']; ?></td>
<td><? echo $rows_Fmission['statuss']; ?></td>
<td><? echo $rows_Fmission['officer']; ?></td>
<td>
<a href="Edit_Mission.php?Emission=<? echo $rows_Fmission['mission_id']; ?>" target="_parent">
<img src="image/edit_icon.png" width="30" height="30">
</a>
</td>
<td>
<a href="Delete_Mission.php?Dmission=<? echo $rows_Fmission['mission_id']; ?>" 
onclick="return confirm ('คุณต้องการลบข้อมูลนี้')" target="_parent">
<img src="image/delete_icon.png" width="30" height="30">
</a>
</td>
</tr>
<?
}
?>
</table>
<?
mysql_close();
?>




Tag : PHP, MySQL









ประวัติการแก้ไข
2013-12-12 15:40:21
2013-12-14 09:09:17
2013-12-14 09:12:02
Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2013-12-12 15:25:04 By : Khun Tee View : 895 Reply : 18
 

 

No. 1



โพสกระทู้ ( 3,844 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Twitter Facebook

เพิ่ม group by ก็น่าจะได้แล้วน่ะ
Code (PHP)
$sql_Fmission="select mission.mission_id,mission.mission,mission.statuss,
officer.officer_id,officer.officer,
mission_officer.mission_id,mission_officer.officer_id
from mission inner join mission_officer on mission.mission_id=mission_officer.mission_id
inner join officer on mission_officer.officer_id=officer.officer_id
group by mission.mission_id order by mission.mission_id asc";









ประวัติการแก้ไข
2013-12-12 15:40:14
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 15:39:42 By : mangkunzo
 


 

No. 2



โพสกระทู้ ( 0 )
บทความ ( 0 )



สถานะออฟไลน์


ลองใส่ group by ตามที่คุณ mangkunzo แนะนำแล้วค่ะ

ผลที่ได้คือ เหลือแค่แถวเดียวก็จริงอยู่
แต่แสดงแค่ นาย A เป็นผู้รับผิดชอบคนเดียว
นาย B หายไปเลยค่ะ

รบกวนช่วยเหลือด้วยนะคะ ติดมาหลายวันแหละ ^___^


ประวัติการแก้ไข
2013-12-12 21:24:52
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 15:51:48 By : Khun Tee
 

 

No. 3

Guest


Code (SQL)
SELECT mission_officer.mission_id, mission.mission, mission.status,
   STUFF((SELECT ',' + officer.officer FROM officer FOR XML PATH('')), , 1, 1, '') AS officer
FROM mission_officer
INNER JOIN mission ON (mission_officer.mission_id = mission.mission_id)
INNER JOIN officer ON (mission_officer.officer_id = officer.officer_id)
GROUP BY mission_officer.mission_id, mission.mission, mission.status
ORDER BY mission_officer.mission_id ASC

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:23:31 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 4

Guest


รู้สึกว่า , ด้านบนตรง FOR XML PATH('')), , 1, 1, ' ') จะเกินไปตัวนึงนะ

ตัดออกด้วยแล้วกัน
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:25:46 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 5

Guest


ลองทำใน sql server 2012 express

1

2
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:38:06 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 6



โพสกระทู้ ( 3,844 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Twitter Facebook

ตอบความคิดเห็นที่ : 2 เขียนโดย : Khun Tee เมื่อวันที่ 2013-12-12 15:51:48
รายละเอียดของการตอบ ::
ลืมดู....ถ้าจะทำแบบนั้น คงต้อง query 2 รอบครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:44:25 By : mangkunzo
 


 

No. 7

Guest


แก้ใหม่ๆ

Code (SQL)
SELECT MO1.mission_id, M1.mission, M1.status,
   STUFF((SELECT ',' + officer.officer 
      FROM mission_officer AS MO2
      INNER JOIN officer AS O2 ON (MO2.officer_id = O2.officer_id)
      WHERE MO2.mission_id = MO1.mission_id FOR XML PATH('')), 1, 1, '') AS officer
FROM mission_officer AS MO1
INNER JOIN mission AS M1 ON (MO1.mission_id = M1.mission_id)
INNER JOIN officer AS O1 ON (MO1.officer_id = O1.officer_id)
GROUP BY MO1.mission_id, M1.mission, M1.status
ORDER BY MO1.mission_id ASC


ปล. งงนะเนี่ย อยากรันดูจัง แต่ไม่มี data ให้รัน
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:53:12 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 8

Guest


ถ้าต้องการแค่ข้อมูลชื่อ (ซึ่งจริงๆ สามารถรวมข้อมูลอื่นๆ ได้ด้วย เช่น id) สามารถ query รอบเดียวได้ครับ
โดยใช้ sub query กับ GROUP_CONCAT() และ JOIN


Code (SQL)
SELECT
    *,
    (
        SELECT GROUP_CONCAT(`officer`.`officer`) FROM  `mission_officer`
        JOIN `officer` USING (`officer_id`)
        WHERE `mission_officer`.`mission_id` = `mission`.`mission_id`
    ) AS `officers`
FROM `mission`
ORDER BY `mission`.`mission_id`


หลักการคือเราจะ GROUP_CONCAT() คือเชื่อมค่า officer.officer ของทุกแถวในตาราง officer ที่ match กับแถวในตาราง mission_officer โดยใช้ officer_id เป็นเงื่อนไข (ดู USING) แบ่งแต่ละชื่อด้วยคอมม่า
โดยให้รายชื่อของ officer ของแต่ละ mission มีชื่อว่าคอลัมน์ officers (ดูตรง AS)

ดังนั้นเวลาเข้าถึง ต้องเข้าถึงด้วย key 'officers' นะครับ


Code (PHP)
<td><? echo $rows_Fmission['officers']; ?></td>

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:54:46 By : K
 


 

No. 9

Guest


แก้อีกๆ ผิดๆ

Code (SQL)
SELECT MO1.mission_id, M1.mission, M1.status,
   STUFF((SELECT ',' + O2.officer 
      FROM mission_officer AS MO2
      INNER JOIN officer AS O2 ON (MO2.officer_id = O2.officer_id)
      WHERE MO2.mission_id = MO1.mission_id FOR XML PATH('')), 1, 1, '') AS officer
FROM mission_officer AS MO1
INNER JOIN mission AS M1 ON (MO1.mission_id = M1.mission_id)
INNER JOIN officer AS O1 ON (MO1.officer_id = O1.officer_id)
GROUP BY MO1.mission_id, M1.mission, M1.status
ORDER BY MO1.mission_id ASC

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:55:02 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 10

Guest


ขออีกทีแระกัน

Code (SQL)
SELECT MO1.mission_id, M1.mission, M1.status,
   STUFF((SELECT ',' + O2.officer 
      FROM mission_officer AS MO2
      INNER JOIN officer AS O2 ON (MO2.officer_id = O2.officer_id)
      WHERE MO2.mission_id = MO1.mission_id FOR XML PATH('')), 1, 1, '') AS officer
FROM mission_officer AS MO1
INNER JOIN mission AS M1 ON (MO1.mission_id = M1.mission_id)
GROUP BY MO1.mission_id, M1.mission, M1.status
ORDER BY MO1.mission_id ASC

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 16:59:27 By : ห้ามตอบเกินวันละ 2 กระทู้
 


 

No. 11

Guest


ลองแล้วได้ผลยังไงมาบอกด้วยนะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 17:01:39 By : K
 


 

No. 12



โพสกระทู้ ( 0 )
บทความ ( 0 )



สถานะออฟไลน์


ตอบความคิดเห็นที่ : 8 เขียนโดย : K เมื่อวันที่ 2013-12-12 16:54:46
รายละเอียดของการตอบ ::

ทำได้ตามรูปที่ 1 แล้วค่ะ
โดยใช้ GROUP_CONCAT() ขอบคุณมากค่ะ
รูปที่ 1

ขอถามเพิ่มเติมอีกนิดนะคะ
ถ้าอยากให้แสดงได้ตามรูปที่ 2
รูปที่ 2

คือ ให้แสดงเป็นข้อๆ แทนคอมม่า สามารถทำได้หรือไม่
ปกติจะใช้ <li> ในการทำเป็นข้อๆ
แต่ถ้านำมาใช้ตรงนี้ ไม่แน่ใจว่าต้องทำอย่างไรคะ



ปล. ขอบคุณทุกความคิดเห็นนะคะ
ทั้งคุณ mangkunzo , คุณห้ามตอบเกินวันละ 2 กระทู้ และคุณ K ค่ะ ^___^


ประวัติการแก้ไข
2013-12-12 21:50:23
2013-12-12 21:54:11
2013-12-12 21:56:48
2013-12-12 23:30:04
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 21:45:32 By : Khun Tee
 


 

No. 13



โพสกระทู้ ( 1,569 )
บทความ ( 2 )



สถานะออฟไลน์
Twitter Facebook Blogger

ตอบความคิดเห็นที่ : 12 เขียนโดย : Khun Tee เมื่อวันที่ 2013-12-12 21:45:32
รายละเอียดของการตอบ ::
แก้จาก
Code (SQL)
STUFF((SELECT ',' + O2.officer

เป็น
Code (SQL)
STUFF((SELECT '</li><li>' + O2.officer

และจาก
Code (PHP)
<td><? echo $rows_Fmission['officer']; ?></td>

แก้เป็น
Code (PHP)
<td><ul><li><? echo $rows_Fmission['officer']; ?></li></ul></td>

ครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 22:12:38 By : itpcc
 


 

No. 14



โพสกระทู้ ( 0 )
บทความ ( 0 )



สถานะออฟไลน์


หมายถึงทำเป็นข้อๆ จากโค๊ด SELECT GROUP_CONCAT() น่ะค่ะ ^___^


ประวัติการแก้ไข
2013-12-12 23:37:44
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-12 23:34:18 By : Khun Tee
 


 

No. 15

Guest


เพิ่มส่วน SEPARATOR เข้าไปใน GROUP_CONCAT() ครับ คือกำหนดตัวอักษรที่จะใช้แบ่งชื่อ เพื่อที่จะเอามาแยกชื่อออกเป็นรายการได้ (จากปกติคือคอมม่า)
ควรเป็นตัวอักษรที่มั่นใจว่าจะไม่มีการใช้ในชื่อ เช่น การขึ้นบรรทัดใหม่ ( \n )


Code (PHP)
$sql_Fmission = "
SELECT
    *,
    (
        SELECT GROUP_CONCAT(`officer`.`officer` SEPARATOR '\\n') FROM  `mission_officer`
        JOIN `officer` USING (`officer_id`)
        WHERE `mission_officer`.`mission_id` = `mission`.`mission_id`
    ) AS `officers`
FROM `mission`
ORDER BY `mission`.`mission_id`
";


แล้วเอามาแยกชื่อใช้ explode() โดยใช้ตัวแบ่งอันเดียวกับตอนที่เราใช้เชื่อมด้วย GROUP_CONCAT()

Code (PHP)
...
<tr bgcolor="#EAF1DD">
<td><? echo $rows_Fmission['mission_id']; ?></td>
<td><? echo $rows_Fmission['mission']; ?></td>
<td><? echo $rows_Fmission['statuss']; ?></td>
<td>
<ul>
<?php
// ตรวจว่ามีผู้ดูแลในรายการนี้หรือไม่
if (isset($rows_Fmission['officers'])) {
    // แยกชื่อด้วยการขึ้นบรรทัดใหม่ ( \n )จะได้ array ของชื่อ
    // เพื่อสามารถนำไปวนลูป แสดงผลแต่ละชื่อในรูปแบบที่ต้องการ
    $officers = explode("\n", $rows_Fmission['officers']);
        foreach ($officers as $officer) {
            ?>
            <li><?php echo $officer; ?></li>
            <?php
        }
} else { // ถ้ายังไม่มีให้แสดงอย่างอื่น
    ?>
    <li>ยังไม่มีผู้รับผิดชอบ</li>
    <?php
}
?>
</ul>
</td>
...

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-13 04:54:43 By : K
 


 

No. 16



โพสกระทู้ ( 0 )
บทความ ( 0 )



สถานะออฟไลน์


ทำได้แล้วค่ะ โดยใช้...

select group_concat(officer.officer separator '</li><li>')

ขอบคุณทุกท่านที่ให้ความช่วยเหลือนะคะ ^___^
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-14 09:04:21 By : Khun Tee
 


 

No. 17



โพสกระทู้ ( 1,994 )
บทความ ( 10 )



สถานะออฟไลน์
Facebook Blogger

https://www.thaicreate.com/tutorial/sql-group-concat.html

ไม่แน่ใจว่าเจ้าของกระทู้ยังใช้ SUB QUERY รึเปล่าครับ
จากบทความนี้ไม่ต้อง SELECT ซ้อนกันก็น่าจะทำได้นะครับ
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-14 09:41:54 By : {Cyberman}
 


 

No. 18

Guest


ตอบความคิดเห็นที่ : 17 เขียนโดย : {Cyberman} เมื่อวันที่ 2013-12-14 09:41:54
รายละเอียดของการตอบ ::
จากบทความนั้น เป็นการ SELECT จากตารางเดียว ไม่มี relation
แต่ในกรณีนี้ต้อง JOIN ถึง 2 ตาราง จึงต้องใช้ sub query ครับ

หรือผมอาจจะยังคิดไม่ออก ถ้ามีวิธีอื่นลองแชร์กันหน่อยครับ

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2013-12-14 09:58:44 By : K
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : ติดปัญหาค่ะ ภารกิจเดียวกัน แต่มีผู้รับผิดชอบหลายคน อยากให้แสดงแค่แถวเดียว ต้องทำอย่างไรค่ะ
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: นำเข้าสินค้าจากจีน, Taobao, เฟอร์นิเจอร์, ของพรีเมี่ยม, ร่ม, ปากกา, power bank, แฟลชไดร์ฟ, กระบอกน้ำ

Load balance : Server 00
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2024 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 อัตราราคา คลิกที่นี่