 |
ติดปัญหาค่ะ ภารกิจเดียวกัน แต่มีผู้รับผิดชอบหลายคน อยากให้แสดงแค่แถวเดียว ต้องทำอย่างไรค่ะ |
|
 |
|
|
 |
 |
|
เพิ่ม 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองใส่ group by ตามที่คุณ mangkunzo แนะนำแล้วค่ะ
ผลที่ได้คือ เหลือแค่แถวเดียวก็จริงอยู่
แต่แสดงแค่ นาย A เป็นผู้รับผิดชอบคนเดียว
นาย B หายไปเลยค่ะ
รบกวนช่วยเหลือด้วยนะคะ ติดมาหลายวันแหละ ^___^
|
ประวัติการแก้ไข 2013-12-12 21:24:52
 |
 |
 |
 |
Date :
2013-12-12 15:51:48 |
By :
Khun Tee |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
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 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
รู้สึกว่า , ด้านบนตรง FOR XML PATH('')), , 1, 1, ' ') จะเกินไปตัวนึงนะ
ตัดออกด้วยแล้วกัน
|
 |
 |
 |
 |
Date :
2013-12-12 16:25:46 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองทำใน sql server 2012 express


|
 |
 |
 |
 |
Date :
2013-12-12 16:38:06 |
By :
ห้ามตอบเกินวันละ 2 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แก้ใหม่ๆ
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 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ถ้าต้องการแค่ข้อมูลชื่อ (ซึ่งจริงๆ สามารถรวมข้อมูลอื่นๆ ได้ด้วย เช่น 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แก้อีกๆ ผิดๆ
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 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ขออีกทีแระกัน
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 กระทู้ |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ลองแล้วได้ผลยังไงมาบอกด้วยนะครับ 
|
 |
 |
 |
 |
Date :
2013-12-12 17:01:39 |
By :
K |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หมายถึงทำเป็นข้อๆ จากโค๊ด SELECT GROUP_CONCAT() น่ะค่ะ ^___^
|
ประวัติการแก้ไข 2013-12-12 23:37:44
 |
 |
 |
 |
Date :
2013-12-12 23:34:18 |
By :
Khun Tee |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เพิ่มส่วน 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 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ทำได้แล้วค่ะ โดยใช้...
select group_concat(officer.officer separator '</li><li>')
ขอบคุณทุกท่านที่ให้ความช่วยเหลือนะคะ ^___^
|
 |
 |
 |
 |
Date :
2013-12-14 09:04:21 |
By :
Khun Tee |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|