[mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ

เริ่มโดย ManyMoney, 22 ธันวาคม 2008, 02:52:02

หัวข้อก่อนหน้า - หัวข้อถัดไป

0 สมาชิก และ 1 ผู้มาเยือน กำลังดูหัวข้อนี้

ManyMoney

จาก table นี้นะครับ
domain      | update                 | keyword          | pr | check
---------------------------------------------------------------------------------------------------------------------------------
google.com   | 2008-10-11 13:01 | seo,search engine,google    | 1 | 3
google.com   | 2008-11-02 21:01 | search engine,google       | 1 | 4
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 4
nipa.com      | 2008-11-01 08:23 | nipa,ads,thai       | 9 | 4
google.com   | 2008-11-02 21:01 | search engine,google       | 2 | 5
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 5
thaiseoboard.com   | 2008-11-04 11:34 | ไทยเสียว,seo,หาเงิน      | 9 | 5

อยากเทียบระหว่าง check=4 กับ check=5 ว่าต่างกันตรงไหนบ้าง
แล้วแสดงผลเป็น
-----------------------------------------
google.com จาก pr 1 เป็น 2
nipa.com ถูกลบ
thaiseoboard.com ถูกเพิ่ม
-----------------------------------------
แค่เนี่ยอ่ะครับ คือถ้าข้อมูลน้อยๆผมก็จะใช้วิธี select เทียบทีละอันเลย  แต่ว่าข้อมูลมันมีเยอะระดับหลัก หลายๆพัน ควรทำยังไงครับที่จะเร็วที่สุดครับ?
ถ้าผมจจะ select * where check = 5 ก่อนแล้วได้เป็น array แล้วอยากจะเอาไปเทียบกับ where check=4 ยังไงให้ได้ผลลัพท์ที่ต้องการได้เร็วและประหยัดcpuสุดๆครับ?

รบกวนชี้แนะด้วยครับ ผมงมมาหลายวันแล้วครับ
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

alert

คำสั่ง MINUS ครับ

SELECT member_id, name FROM a
MINUS
SELECT member_id, name FROM b

ตามนี้เลยครับ ลองประยุกต์ใช้ดูละกันครับ
***** รับซื้อเว็บไซต์สายขาวคุณภาพ  ตั้งแต่ 500-30,000 uip มี traffic มาจาก Google  และไม่เคยโดนแบน adsense  เสนอราคามาทาง pm ได้เลยครับ *****

ManyMoney

ปัญหาของผมคือมีแค่ table เดียวอ่ะ
MINUS ใช้กับการตรวจสอบ table เดียวกันได้เหรอครับ?  :-X
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

ManyMoney

http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

Tee++;

SELECT a.domain, (a.pr - b.pr) AS result FROM table a INNER JOIN table b USING(domain) WHERE a.check=3 AND b.check=4 GROUP BY a.domain

*** เขียนมันสดๆ ยังไม่ได้ test
[direct=http://laravel.in.th]Laravel in Thai[/direct]
[direct=http://jquerytips.com]jQueryTips by Tee++;[/direct]
[direct=https://www.facebook.com/jQueryTips]jQueryTips Page[/direct]
[direct=https://www.facebook.com/Laravel.in.th]Laravel in Thai Page[/direct]
[direct=https://twitter.com/Teepluss]Teepluss's Twitter[/direct]


alert

select domain , update ,keyword,pr from table where check=4
minus
select domain , update ,keyword,pr from table where check=5

มันก็กลายเป็นหลาย table แล้วหล่ะ ผมไม่รู้ชื่อ table นะ ไปเปลี่ยนเอาเองนะครับ  :)
***** รับซื้อเว็บไซต์สายขาวคุณภาพ  ตั้งแต่ 500-30,000 uip มี traffic มาจาก Google  และไม่เคยโดนแบน adsense  เสนอราคามาทาง pm ได้เลยครับ *****

ManyMoney

แล้วจะทำยังไงให้มันแสดงผล ได้เป็น
--------------------------
google.com จาก pr 1 เป็น 2
nipa.com ถูกลบ
thaiseoboard.com ถูกเพิ่ม
--------------------------
ได้บ้างครับ?
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

EThaiZone

อ้างถึงจาก: watchi ใน 23 ธันวาคม 2008, 01:45:58
select domain , update ,keyword,pr from table where check=4
minus
select domain , update ,keyword,pr from table where check=5

มันก็กลายเป็นหลาย table แล้วหล่ะ ผมไม่รู้ชื่อ table นะ ไปเปลี่ยนเอาเองนะครับ  :)

เล่น oracle เหรอครับ

คือ minus ใน mysql มันไม่มีอะ
อยากใช้ ต้องเล่น left join แทน

SELECT a.domain, a.update, a.keyword, a.pr
FROM table a
LEFT JOIN table b ON a.check = 5 AND b.check = 4
WHERE b.check IS NULL

น่าจะแนวๆ นี้มั้ง

--------------------------------------------------

อ้างถึงจาก: getkey1 ใน 23 ธันวาคม 2008, 02:01:39
แล้วจะทำยังไงให้มันแสดงผล ได้เป็น
--------------------------
google.com จาก pr 1 เป็น 2
nipa.com ถูกลบ
thaiseoboard.com ถูกเพิ่ม
--------------------------
ได้บ้างครับ?

เป็นผมๆ ก็ทำอย่างที่ตอบใน pm ไปแหละครับ (select แยกแล้วมาวนลูปเีทียบเอา)

เพราะดูจากความต้องการ ก็ต้องการแสดงผลละเอียดพอดู
พวกนี้ต้องทำบน php แล้วล่ะครับ

:P

ManyMoney

สรุปผมควรจะ select 2 ครั้ง
$sqlA = select domain , update , keyword , pr From Table Where check=4
และ
$sqlB =  select domain , update , keyword , pr From Table Where check=5
แบบนี้ใช่ไหมครับ

แล้วจะเอาค่า array มาเทียบกันยังไงดีครับ?
$resultA = mysql_db_query($dbname,$sqlA);
$resultB = mysql_db_query($dbname,$sqlB);
while ($rowA = mysql_fetch_array($resultA)) {
งงตรงเนียครับ?
}


สงสัยครับ ถ้าเปรียบเทียบ Select 2 ครั้งด้านบน กับ LEFT JOIN ตามที่คุณ Ethaizone แนะนำ อย่างไหนดีกว่าครับ? หรือว่ามันเหมือนกันครับ
แล้ว วิธี LEFT JOIN จะ เทียบข้อมูล 2 array ยังไงครับ? ขอบคุณมากครับ
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

EThaiZone

เดียวก่อนนะครับ ที่จะทำนี้คือแค่เทียบ pr กับแสดงเว็บหรือเปล่า ไม่แน่อาจทำแบบนี้ได้

SELECT a.domain, a.pr, b.domain, b.pr
FROM table a
OUTER JOIN table b ON a.domain = b.domain
WHERE a.check = 4 AND b.check = 5

แล้วมันน่าจะได้รายการมาแนวนี้

google.com  | 1 | google.com  | 2   |
live.com      | 2 |  live.com      | 2 |
nipa.com     | 4 |                   |    |
                 |    | thaiseoboard.com   |9 |

ก็พอเป็น array ก็เทียบกันเลย ถ้าต่างกัน ก็คือ pr อัพเดต
ถ้ามีตัวหน้า ตัวหลังค่าเปล่า ก็เว็บโดนลบ
เหมือนกัน ถ้าตัวหน้าไม่มี แต่ตัวหลังมาใหม่ (อย่างไทยเสียว) ก็คือเว็บโดนเพิ่ม

ไม่น่ายากแล้วนะครับ  :P

ManyMoney

อ้างถึงจาก: EThaiZone ใน 23 ธันวาคม 2008, 02:33:07
เดียวก่อนนะครับ ที่จะทำนี้คือแค่เทียบ pr กับแสดงเว็บหรือเปล่า ไม่แน่อาจทำแบบนี้ได้

SELECT a.domain, a.pr, b.domain, b.pr
FROM table a
OUTER JOIN table b ON a.domain = b.domain
WHERE a.check = 4 AND b.check = 5

แล้วมันน่าจะได้รายการมาแนวนี้

google.com  | 1 | google.com  | 2   |
live.com      | 2 |  live.com      | 2 |
nipa.com     | 4 |                   |    |
                 |    | thaiseoboard.com   |9 |

ก็พอเป็น array ก็เทียบกันเลย ถ้าต่างกัน ก็คือ pr อัพเดต
ถ้ามีตัวหน้า ตัวหลังค่าเปล่า ก็เว็บโดนลบ
เหมือนกัน ถ้าตัวหน้าไม่มี แต่ตัวหลังมาใหม่ (อย่างไทยเสียว) ก็คือเว็บโดนเพิ่ม

ไม่น่ายากแล้วนะครับ  :P

ขอบคุณมากครับ  เดี๋ยวขอไปลองดูก่อน
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

alert

อ้างถึงจาก: EThaiZone ใน 23 ธันวาคม 2008, 02:16:58
อ้างถึงจาก: watchi ใน 23 ธันวาคม 2008, 01:45:58
select domain , update ,keyword,pr from table where check=4
minus
select domain , update ,keyword,pr from table where check=5

มันก็กลายเป็นหลาย table แล้วหล่ะ ผมไม่รู้ชื่อ table นะ ไปเปลี่ยนเอาเองนะครับ  :)

เล่น oracle เหรอครับ

คือ minus ใน mysql มันไม่มีอะ
อยากใช้ ต้องเล่น left join แทน


เหอะๆๆ จริงด้วยครับ โทษทีครับ ไม่ได้ลองก่อนเพราะเครื่องผมไม่มี mysql อ่ะครับ แต่ตอนนี้ก็น่าจะ okแล้วนี่ครับ บอกซะขนาดนั้นน่าจะได้แล้วหล่ะ :)
***** รับซื้อเว็บไซต์สายขาวคุณภาพ  ตั้งแต่ 500-30,000 uip มี traffic มาจาก Google  และไม่เคยโดนแบน adsense  เสนอราคามาทาง pm ได้เลยครับ *****

EThaiZone

มาแปะแถม

อย่าลืมนะครับ พวกฟิลด์ที่มีการใช้งาน
เช่นใช้ใน on หรือ where (ถ้าจากตัวอย่าง ก็คือ check)

ทำ index ให้มันด้วย กินพื้นที่หน่อย แต่ไวขึ้นแน่นอน  ::)

(ทำใน phpmyadmin ก็ได้)

ManyMoney

ไม่ออกอะครับ มัน error
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
งมทั้งคืนเลยครับ
??? ??? ??? ??? ???
http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

ManyMoney

พอเปลี่ยนจาก OUTER JOIN เป็น Left หรือ right มันไม่มี error แล้วครับ
แต่ว่าข้อมูลที่ ถูกลบ และ ถูกเพิ่ม มันหายไปจาก result ครับ
อันนี้ที่หายไป
nipa.com     | 4 |                   |    |
              |    | thaiseoboard.com   |9 |
ต้องทำยังไงให้ได้ค่าพวกนี้ครับ

http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

Pipo

พวกเทียบๆ กันผมชอบใช้ hash (associative array)
เดาว่า check คือ field ที่บอกครั้งที่ update ล่าสุด
พอดีอยากลองเขียนดู ผลเป็นดังนี้

<?php

$cfg_db_host =
"localhost";
$cfg_db_name = "db_name";
$cfg_db_user = "root";
$cfg_db_pass = "";

$db mysql_connect($cfg_db_host,$cfg_db_user,$cfg_db_pass); 
mysql_select_db($cfg_db_name);
if (!
$db) { die('Could not connect: ' mysql_error()); }
mysql_query("SET NAMES UTF8");
mysql_query("SET character_set_results=UTF8");

$sql "SELECT `domain`,`pr` FROM `test` WHERE `check` = 4";
$result mysql_query($sql);
if (!
$result) { echo "$sql"; die("\n Invalid query: " mysql_error()); }
while(
$row mysql_fetch_array($result)) {
$check_old[$row['domain']]['pr'] = $row['pr'];
}
mysql_free_result($result);

$sql "SELECT `domain`,`pr` FROM `test` WHERE `check` = 5";
$result mysql_query($sql);
if (!
$result) { echo "$sql"; die("\n Invalid query: " mysql_error()); }
while(
$row mysql_fetch_array($result)) {
$check_new[$row['domain']]['pr'] = $row['pr'];
}
mysql_free_result($result);
mysql_close($db);



foreach (
array_keys($check_new) as $domain) { 
$pr_new $check_new["$domain"]['pr'];
# มีทั้งใหม่และเก่า
if ($check_old["$domain"]) { 
$pr_old $check_old["$domain"]['pr'];
if ($pr_new != $pr_old) { 
echo "$domain เปลี่ยน pr $pr_old -> $pr_new\n";
}
}
# ไม่มีในตัวเก่า
else { 
echo "$domain ถูกเพิ่ม\n";
}
}


foreach (
array_keys($check_old) as $domain) { 
# ไม่มีในตัวใหม่
if (!$check_new["$domain"]) { 
echo "$domain ถูกลบ\n";
}
}


?>

EThaiZone

อ้างถึงจาก: getkey1 ใน 23 ธันวาคม 2008, 12:59:38
พอเปลี่ยนจาก OUTER JOIN เป็น Left หรือ right มันไม่มี error แล้วครับ
แต่ว่าข้อมูลที่ ถูกลบ และ ถูกเพิ่ม มันหายไปจาก result ครับ
อันนี้ที่หายไป
nipa.com     | 4 |                   |    |
              |    | thaiseoboard.com   |9 |
ต้องทำยังไงให้ได้ค่าพวกนี้ครับ

เอิ้ก ลืมไป คือเป้าหมายต้องทำ full outer join
เพิ่งค้น mysql ทำม่ายด้ายย = =" ไม่ใช่ oracle (พลาดแบบคุณ watchi เลย)
งั้นเปลี่ยนมาใช้ union แทนละกันครับ  :P

SELECT a.domain, a.pr FROM table a LEFT JOIN table b ON a.domain = b.domain
UNION
SELECT b.domain, b.pr FROM table a RIGHT JOIN table b ON a.domain = b.domain

:-X

Seree

อ้างถึงจาก: getkey1 ใน 22 ธันวาคม 2008, 02:52:02
จาก table นี้นะครับ
domain      | update                 | keyword          | pr | check
---------------------------------------------------------------------------------------------------------------------------------
google.com   | 2008-10-11 13:01 | seo,search engine,google    | 1 | 3
google.com   | 2008-11-02 21:01 | search engine,google       | 1 | 4
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 4
nipa.com      | 2008-11-01 08:23 | nipa,ads,thai       | 9 | 4
google.com   | 2008-11-02 21:01 | search engine,google       | 2 | 5
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 5
thaiseoboard.com   | 2008-11-04 11:34 | ไทยเสียว,seo,หาเงิน      | 9 | 5

อยากเทียบระหว่าง check=4 กับ check=5 ว่าต่างกันตรงไหนบ้าง
แล้วแสดงผลเป็น
-----------------------------------------
google.com จาก pr 1 เป็น 2
nipa.com ถูกลบ
thaiseoboard.com ถูกเพิ่ม
-----------------------------------------
แค่เนี่ยอ่ะครับ คือถ้าข้อมูลน้อยๆผมก็จะใช้วิธี select เทียบทีละอันเลย  แต่ว่าข้อมูลมันมีเยอะระดับหลัก หลายๆพัน ควรทำยังไงครับที่จะเร็วที่สุดครับ?
ถ้าผมจจะ select * where check = 5 ก่อนแล้วได้เป็น array แล้วอยากจะเอาไปเทียบกับ where check=4 ยังไงให้ได้ผลลัพท์ที่ต้องการได้เร็วและประหยัดcpuสุดๆครับ?

รบกวนชี้แนะด้วยครับ ผมงมมาหลายวันแล้วครับ

อันนี้ครับ ทีเดียวจบ


select distinct domain,
ifnull(
(select concat(pr,'->',l1.pr) from Lab l2 where l1.domain=l2.domain and chk=4),
'New') 'status'
from Lab l1
where chk=5
union
select distinct domain,
'Deleted'
from Lab l1
where chk=4 and (select count(*) from Lab where domain=l1.domain and chk=5)=0
;


ผลลัพธ์ตย.ครับ

ManyMoney

ขอบคุณทั้ง 3 ท่านมากๆครับ สุดยอดมากๆเลยครับ

คือจากตัวอย่างโจทย์ผมเช็คแค่ PR อย่างเดียว แต่จริงๆแล้วผมต้องการเช็คอย่างอื่นด้วย เช่น
update , keyword ,... จริงๆมีประมาณ 50 อันที่ต้องการตรวจสอบความแตกต่าง
อยากทราบว่า จากข้างบนทั้ง 3 วิธี วิธีไหนที่จะทำงานได้ดีที่สุด เร็วที่สุด และไม่loadเครื่องมากครับ?

domain      | update                 | keyword          | pr | check
---------------------------------------------------------------------------------------------------------------------------------
google.com   | 2008-10-11 13:01 | seo,search engine,google    | 1 | 3
google.com   | 2008-11-02 21:01 | search engine,google       | 1 | 4
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 4
nipa.com      | 2008-11-01 08:23 | nipa,ads,thai       | 9 | 4
google.com   | 2008-11-02 21:01 | search engine,google       | 2 | 5
live.com      | 2008-11-02 10:17 | live,microsoft,search      | 2 | 5
thaiseoboard.com   | 2008-11-04 11:34 | ไทยเสียว,seo,หาเงิน      | 9 | 5


แบบของคุณ Pipo มันต้อง select 2 ครั้งเข้าใจง่ายดีครับ ถ้าจะเพิ่มการตรวจสอบอีกสัก 50ช่องต้องแก้ยังไงให้สั้นที่สุดครับ

แบบของคุณ EThaiZone union แล้วใส่ where ต้องไหนครับ ทั้ง2selectหรือว่า ทำรวมเลย ทำไมผมมีerrorทั้งคู่

แบบของคุณ Seree  สุดยอดน่าใช้มากครับ แต่พอผมไปลองใช้งานจริง คือเปรียบเทียบหลายๆfieldพร้อมๆกันแล้วมัน errorอ่ะครับ หรือผม เขียนอะไรผิดช่วยแนะนำหน่อยครับ?

ช่วยยกตัวอย่างกรณี เปรียบเทียบมากๆหลายๆช่องหน่อยครับ เช่น pr ,update ,keyword ,seo ,score ,index ,visit ,uip ,pageview ,ip ,respondtime ,type ,size , position , rate ,... สมมุติว่ามี 50 field ควรแก้ยังไงครับ?

http://www.thaiseoboard.com/index.php/topic,180250.msg2456335.html#msg2456335 หานายทุนโรงไฟฟ้าพลังสะอาด

ขายที่ดินสวนผึ้ง พร้อมบ้าน7หลัง รวม12ไร่ ด้านหน้าติดถนน ด้านหลังติดเขา มีธารน้ำ วิวสวยที่สุดในสวนผึ้ง ขายรวม 12.7 ล้านบาท ภบท.5 สนใจpmขอดูรูปได้เลยครับ

EThaiZone

กรำๆ ผมลืมใส่ where ให้

SELECT a.domain, a.pr FROM table a LEFT JOIN table b ON a.domain = b.domain WHERE a.check=4
UNION
SELECT b.domain, b.pr FROM table a RIGHT JOIN table b ON a.domain = b.domain WHERE b.check=5

อ้างถึงจาก: getkey1 ใน 24 ธันวาคม 2008, 03:37:09
ช่วยยกตัวอย่างกรณี เปรียบเทียบมากๆหลายๆช่องหน่อยครับ เช่น pr ,update ,keyword ,seo ,score ,index ,visit ,uip ,pageview ,ip ,respondtime ,type ,size , position , rate ,... สมมุติว่ามี 50 field ควรแก้ยังไงครับ?

ถ้าเป็นเช็คเยอะๆ ก็คงต้อง query แยกแล้วลง array มาตรวจหาคู่ดูครับ (กลับมาพื้นฐานเลย)
เพราะใช้แนวคิดแบบ minus ไม่ได้ เพราะข้อมูลมันมากกว่าชนิดตัวเลข
แต่อาจใช้แบบ full outer join ได้

ส่วนแบบคุณ Seree ละก็ ไม่อยากบลัฟนะครับ แต่มันอืดแน่นอน
เรื่องประมวลผลแนะนำมาทำบน php นะดีกว่า
select ตั้งหลายรอบ  :P