 |
เหมือนกันแสดงอันเดียว // เริ่มจาก Query ข้อมูลเพื่อหาว่าพนักงานแต่ละคนอยู่ในกลุ่มงานอะไรบ้าง $result |
|
 |
|
|
 |
 |
|
group by field
|
 |
 |
 |
 |
Date :
13 มี.ค. 2551 10:02:35 |
By :
กบนอกกะลา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่ได้ครับ
คือว่าดูโค๊ดอย่างง่าย ๆ ด้านล่างนี้นะครับ
เริ่มจากผมไป Query ข้อมูลเพื่อหากลุ่มวิชาที่ตรงกับพนักงาน และจากนั้นก็ไป Query ข้อมูลในรตารางวิชาที่ตรงกับกับกลุ่มวิชาที่พนักงานนั้น ๆ ต้องเรียน ถ้าใช้ Group by ไม่ได้ครับและใช้ DISTINCT ก็ไม่ได้เพราะมัน where ที่ userID มันเลขนำมาแสดงทั้งหมด
ถ้าในตารางแรกที่เข้าไป Query มี 2 ID ที่พนักงาน (userID) นั้นมีเช่น
1,3 จากนั้นก็ไป Query ข้อมูลในตารางที่ 2 เพื่อแสดงรายชื่อวิชาที่ตรงกับ ID ของตารางแรกและผลที่ได้คคือ
ID ตารางแรก IDตารางที่สอง
1 1
1 2
1 3
2 1
2 5
2 6
จะเห็นว่า ID ตารางที่สองมันมีซ้ำกันนะครับ ที่นี้ผมต้องการให้มันแสดง ID ที่สองที่ซ้ำกันออกมาแค่ อันเดียว เพราะเวลานำไปแสดงผลจะนำ ID ที่ตารางที่สองไปแสดงครับ
$strSql1 = "SELECT * FROM jdjs_especial WHERE userID='$userID'";
$result1 = mysql_db_query($dbname3, $strSql1);
while($row1=mysql_fetch_array($result1))
{
$strSql 2 = "SELECT DISTINCT clID FROM jdjs_spcourse WHERE jdsID='$row1[jdsID]' AND msnID<>4 AND cgID='4'";
$result2 = mysql_db_query($dbname3, $strSql);
while($row2 = mysql_fetch_array($result2))
{
echo $row2[clID];
echo "<br>";
}
}
|
 |
 |
 |
 |
Date :
13 มี.ค. 2551 10:35:57 |
By :
com1com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
group by ซ้อน group by
|
 |
 |
 |
 |
Date :
13 มี.ค. 2551 15:33:27 |
By :
กบนอกกะลา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ซ้อนยังงัยครับ
|
 |
 |
 |
 |
Date :
13 มี.ค. 2551 15:45:52 |
By :
com1com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
select*from table where field=$var group by field;
while($row=....){
$var1= $row['field1'];
select*from table2 where field = $var1 group by field;
while($row2='''){
}
}
ใช้วิธีคุณก็ได้ครับ เพียงแต่ว่าเอาตั้วแปรจากคิวรี่แรกมาใช้กับคิวรี่สองด้วย ไม่งั้น ค่ามันไม่ตรงกันแน่นอน
|
 |
 |
 |
 |
Date :
13 มี.ค. 2551 16:03:55 |
By :
กบนอกกะลา |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตารางที่ 1
jdsID userID
1 --> s0001
2 --> s0001
3 --> s0005
4 --> s0004
ตารางที่ 2
no jdsID clID
1 --> 1 --> 1
2 --> 1 --> 2
3 --> 1 --> 3
4 --> 2 --> 1
5 --> 2 --> 5
6 --> 2 --> 6
7 --> 3 --> 7
8 --> 3 --> 2
จะเห็นว่าตารางแรกนั้นพนักงานที่มีรหัส s0001 นั้นจะตรงกับ jdsID 1 และ 2 นะครับ
ในการคิวรี่ครั้งแรกนั้นก็จะรู้ว่าพนักงานคนนั้น ๆตรงกับรหัสกลุ่มวิชาอะไรบ้าง
$strSql = "SELECT * FROM $table1 WHERE userID=s0001";
$result = mysql_db_query($dbname1, $strSql);
while($row = mysql_fetch_array($result))
{
$jdsID = $row[jdsID];
//คิวรี่ครั้งที่สองนั้นจะนำ jdsID ไปหาว่าตรงกับวิชาไหนบ้าง
$strSql1="SELECT * FROM $table2 WHERE jdsID='$jdsID' GROUP BY clID";
$result1=mysql_db_query($dbname1, $strSql1);
while($row1=mysql_fetch_array($result1))
{
echo $clID = $row1[clID];
echo "<br>";
}
}
ค่าที่ได้คือ
1
2
3
1
5
6
จะเห็นว่าค่าที่ได้มานั้นจะมีที่ซ้ำกันคือ 1 ที่ใช้ group by ไม่ได้นั้นเพราะว่าค่าที่ได้จากการคิวรี่ครั้งแรกนั้นมันจะได้
1 และ 2 มานะครับ...พอาเรานำค่านั้นมา where ที่การคิวรี่ครั้งที่สองนั้นมันก็จะ where ที่ค่าที่เรากำหนดมา ดังนั้นการใช้ group by มันไม่ได้ผลครับ
พอจะมีวิธีมั๊ยครับ...ชี้นำหน่อย
|
 |
 |
 |
 |
Date :
14 มี.ค. 2551 09:13:13 |
By :
com1com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้ subquery ครับ
SELECT `noID`,`jdsID`,`clID` FROM `clid` WHERE `jdsID` in (SELECT `jdsID` FROM `userid` WHERE `userID`='s0001') group by clID order by clID
ตาราง1 clID
ตาราง1 userid
จะได้ผลลัพธ์
1
2
3
5
6
ครับ
|
 |
 |
 |
 |
Date :
14 มี.ค. 2551 09:34:39 |
By :
takereu |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้ subquery ครับ
SELECT `noID`,`jdsID`,`clID` FROM `clid` WHERE `jdsID` in (SELECT `jdsID` FROM `userid` WHERE `userID`='s0001') group by clID order by clID
ตาราง1 clID
*ตาราง2 userid
จะได้ผลลัพธ์
1
2
3
5
6
ครับ
*แก้ไข
|
 |
 |
 |
 |
Date :
14 มี.ค. 2551 09:37:31 |
By :
takereu |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
หรือถ้าจะเอาเฉพาะฟิลด์ clID
ไม่ต้องใช้ group by ก็ได้
ใช้ distinct แทน แบบนี้ครับ
SELECT distinct `clID` FROM `clid` WHERE `jdsID` in (SELECT `jdsID` FROM `userid` WHERE `userID`='s0001') order by clID
ลองดู
|
 |
 |
 |
 |
Date :
14 มี.ค. 2551 09:42:29 |
By :
takereu |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ได้แล้วครับ....ผมเลือกวิธีที่ "ความคิดเห็นที่ 9 " ครับ ขอบคุณคุณ takereu มาก ๆ ครับ ยังไงช่วยอธิบายอีกนิดนึง...ว่ามีความหาหมายว่ายังไงครับ
ขอบคุณมาก ๆ ๆ ๆ ๆ
แล้วถ้า
ฐานข้อมูลที่ 1
ตาราง courselist1 มีฟิลด์ดังนี้
clID
1
2
3
4
5
เวลาใช้ while ลูป ให้แสดงผลออกมาก็จะได้ค่า
1
2
3
4
5
ฐานข้อมูลที่ 2
ตาราง courselist2 มีฟิลด์ดังนี้
slID
1
2
3
4
5
6
เวลาใช้ while ลูป ให้แสดงผลออกมาก็จะได้ค่า
1
2
3
4
5
6
ถ้าเราต้องการจะ compare กันโดยข้อมูลที่ซ้ำกันแล้วจะไม่นำมาแสดงในลักษณะนี้ครับ
ฝั่งซ้ายเก็บข้อมูลของฐานข้อมูลที่ 1 | ฝั่งขวาเก็บข้อมูลของฐานข้อมูลที่ 2
1 --> 1
2 --> 2
3 --> 3
4 --> 4
5 --> 6
ความหมายก็คือฝั่งซ้ายคือวิชาที่เรียนไแล้วเมื่อเทียบกับฝั่งขวาจะต้องให้เหลือวิชาที่ยังไม่ได้เรียน
ฝั่งซ้ายเก็บข้อมูลของฐานข้อมูลที่ 1 | ฝั่งขวาเก็บข้อมูลของฐานข้อมูลที่ 2
1 --> 6
2
3
4
5
จะต้องใช้คำสั่งอะไรครับ
|
 |
 |
 |
 |
Date :
14 มี.ค. 2551 10:18:09 |
By :
com1com |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|
|