หัวข้อ: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 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สุดๆครับ? รบกวนชี้แนะด้วยครับ ผมงมมาหลายวันแล้วครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: alert ที่ 22 ธันวาคม 2008, 04:46:54 คำสั่ง MINUS ครับ
SELECT member_id, name FROM a MINUS SELECT member_id, name FROM b ตามนี้เลยครับ ลองประยุกต์ใช้ดูละกันครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 22 ธันวาคม 2008, 06:26:11 ปัญหาของผมคือมีแค่ table เดียวอ่ะ
MINUS ใช้กับการตรวจสอบ table เดียวกันได้เหรอครับ? :-X หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 22 ธันวาคม 2008, 21:12:55 ดันครับ
หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: Tee++; ที่ 23 ธันวาคม 2008, 00:58:56 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 หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: alert ที่ 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 นะ ไปเปลี่ยนเอาเองนะครับ :) หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 23 ธันวาคม 2008, 02:01:39 แล้วจะทำยังไงให้มันแสดงผล ได้เป็น
-------------------------- google.com จาก pr 1 เป็น 2 nipa.com ถูกลบ thaiseoboard.com ถูกเพิ่ม -------------------------- ได้บ้างครับ? หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 23 ธันวาคม 2008, 02:16: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 น่าจะแนวๆ นี้มั้ง -------------------------------------------------- แล้วจะทำยังไงให้มันแสดงผล ได้เป็น -------------------------- google.com จาก pr 1 เป็น 2 nipa.com ถูกลบ thaiseoboard.com ถูกเพิ่ม -------------------------- ได้บ้างครับ? เป็นผมๆ ก็ทำอย่างที่ตอบใน pm ไปแหละครับ (select แยกแล้วมาวนลูปเีทียบเอา) เพราะดูจากความต้องการ ก็ต้องการแสดงผลละเอียดพอดู พวกนี้ต้องทำบน php แล้วล่ะครับ :P หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 23 ธันวาคม 2008, 02:29:38 สรุปผมควรจะ 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 ยังไงครับ? ขอบคุณมากครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: 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 หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 23 ธันวาคม 2008, 02:43:31 เดียวก่อนนะครับ ที่จะทำนี้คือแค่เทียบ 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 ขอบคุณมากครับ เดี๋ยวขอไปลองดูก่อน หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: alert ที่ 23 ธันวาคม 2008, 03:18:32 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แล้วนี่ครับ บอกซะขนาดนั้นน่าจะได้แล้วหล่ะ :) หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 23 ธันวาคม 2008, 05:18:02 มาแปะแถม
อย่าลืมนะครับ พวกฟิลด์ที่มีการใช้งาน เช่นใช้ใน on หรือ where (ถ้าจากตัวอย่าง ก็คือ check) ทำ index ให้มันด้วย กินพื้นที่หน่อย แต่ไวขึ้นแน่นอน ::) (ทำใน phpmyadmin ก็ได้) หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 23 ธันวาคม 2008, 09:51:48 ไม่ออกอะครับ มัน error
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource งมทั้งคืนเลยครับ ??? ??? ??? ??? ??? หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 23 ธันวาคม 2008, 12:59:38 พอเปลี่ยนจาก OUTER JOIN เป็น Left หรือ right มันไม่มี error แล้วครับ
แต่ว่าข้อมูลที่ ถูกลบ และ ถูกเพิ่ม มันหายไปจาก result ครับ อันนี้ที่หายไป nipa.com | 4 | | | | | thaiseoboard.com |9 | ต้องทำยังไงให้ได้ค่าพวกนี้ครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: Pipo ที่ 23 ธันวาคม 2008, 14:46:28 พวกเทียบๆ กันผมชอบใช้ hash (associative array)
เดาว่า check คือ field ที่บอกครั้งที่ update ล่าสุด พอดีอยากลองเขียนดู ผลเป็นดังนี้ โค๊ด: <?php หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 23 ธันวาคม 2008, 14:59:51 พอเปลี่ยนจาก 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 หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยัง เริ่มหัวข้อโดย: Seree ที่ 23 ธันวาคม 2008, 17:23:49 จาก 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, ผลลัพธ์ตย.ครับ (http://www.fasterinternetmarketing.com/thaiseo/result.gif) หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 24 ธันวาคม 2008, 03:37:09 ขอบคุณทั้ง 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 ควรแก้ยังไงครับ? หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 24 ธันวาคม 2008, 08:21:59 กรำๆ ผมลืมใส่ 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 ช่วยยกตัวอย่างกรณี เปรียบเทียบมากๆหลายๆช่องหน่อยครับ เช่น 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 หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยัง เริ่มหัวข้อโดย: Seree ที่ 24 ธันวาคม 2008, 11:54:25 ผมไม่ได้บลัฟกลับคุณ EThaiZone โปรแกรมเมอร์มือหนึ่งของที่นี่นะครับ ถือว่าคุยกันด้านวิชาการหา solution ที่ดีที่สุดให้กับผู้ตั้งโจทย์ละกันนะครับ
- query ของผม มี execution plan ที่ใช้ resource น้อยกว่าของคุณครับ - ถ้า query ของคุณดีกว่าของผมจริง (สมมติไม่นับ execution plan) แล้วเอาเวลาในการ query + การนำ php ไปประมวลผลลัพธ์ ผมรับรองได้ว่าช้ากว่าของผมมากครับ (คุณ getkey1 ตั้งโจทย์นี้มาผมคิดว่าเค้าคงรู้ข้อนี้ดีครับ) - คำสั่ง select count สุดท้ายของผมสามารถทำให้รันแค่ครั้งเดียวได้ครับ แต่ตอนนี้ prove of concept ก่อน ค่อย optimize ตามหลังครับ - ผลลัพธ์สุดท้ายของผมน่าจะตรงใจคุณ getkey1 ที่สุดครับ คุณ getkey1 ลองบอกตย.การเปรียบเทียบฟิลด์อื่นด้วยได้มั้ยครับ เดี๋ยวจะช่วยกันหา solution ให้ครับ (ผมได้รับ PM แล้ว และตอบกลับไปแล้วครับ) ขอบคุณครับ ปล.วันนี้อย่าลืมเชียร์บอลไทยครับ :) หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 24 ธันวาคม 2008, 12:26:37 เอ้ว!! :o ผมไม่ได้คิดว่าตัวเองมือหนึ่งนะ ทุกวันนี้ยังนับถือพี่ Tee++; พี่ Gootum พี่ icez เลย
แค่ผมชอบอ่าน doc บนหน้าเว็บเท่านั้นเอง และช่วยได้ก็ช่วยกันไป เราคนช่วยก็ได้ค้นคว้าเพิ่มด้วย เพราะไม่ใช่ว่าเราจะรู้ไปทุกเรื่อง แต่ผมชอบที่มีคนถกกันเรื่องแบบนี้ครับ :) มีน้อยบอร์ดจริงๆ เพราะมักไม่ค่อยอยากพิมพ์ยาวๆ กัน แต่ที่ผมว่าอืดเพราะ count(*) มันก็แค่ยังไล่นับอยู่ดี หลายคนว่า เลี่ยงได้อย่าใช้ count กับ * เลย เว้นแต่ condition เยอะหน่อยจน result ไม่น่าจะเยอะเกินไป ซึ่งงานคุณgetkey1 ดูแล้วจะจัดการแค่ table เดียว กับข้อมูลสองตัว (check=4 และ check=5) เลยสู้ให้มันหาข้อมูลดิบสองครั้ง แล้วมาจัดการเอาบน php ดีกว่า แถมจะเขียนคำนวณอย่างอื่นเพิ่ม ก็น่าสบายกว่า (สำหรับผมอะน่ะ) งานนี้แล้วแต่สไตล์คนทำด้วยละมั้ง :D แต่ยอมรับเลยเรื่อง sql ผมรู้ไม่เยอะ ผมเห็น query ที่คุณ Seree เขียนยังอึ๊งเลย (อึ้งเพราะผมเขียนแบบนั้นไม่ได้) นึกถึงสมัยผมนั่งบ้าบน excel เล่นฟังค์ชั่นและ if ยัดๆ ลงเซลล์เดียวเยอะๆ ^o^ ปล. พักนี้เล่น dot hack g.u ชักติด emoticon แบบเก่าๆ :o (พิมพ์จาก fast reply) ปล2. มือจะน็อกแล้ว วันนี้ขอขายละครับ (มือข้างเดียว) T-T หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยัง เริ่มหัวข้อโดย: siamman ที่ 24 ธันวาคม 2008, 12:38:50 โค๊ด: select distinct domain, ผลลัพธ์ตย.ครับ ([url]http://www.fasterinternetmarketing.com/thaiseo/result.gif[/url]) ขอบคุณครับ mysql นี่ สงสัยต้องศึกษาเพิ่มเติม อีกเยอะแฮะ คำสั่งบางอย่างไม่ต้องมาเขียน php ไห้ประมวลผลเลย น่าสนใจมากมาย หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 24 ธันวาคม 2008, 12:37:25 คือว่า... เออ
ผมต้องไปเขียนตรงโปรแกรมอื่นก่อน ตรงส่วนนี้ของผมเลยทำแบบ ขอไปทีก่อน เพราะทีแรกตั้งโจทย์ให้ ผู้เชียวชาญช่วยแก้ แล้วกะมาโมต่อเอง แต่กลับหัวไม่ถึงครับ โมต่อเองแล้วerror จุดประสงค์ของโปรแกรมคือ ไม่ได้เทียบแค่ pr อย่างเดียว แต่เทียบอีกหลายๆอย่างประมาณ50อย่าง ว่าที่check=4 และ check=5 มีอะไรบ้างที่ไม่เหมือนกันครับ และมีอะไรเพิ่มมาใหม่บ้าง ตอนนี้ที่บอกว่าทำแบบขอไปที คือผมselect 2 ครั้ง ครั้งแรก คือ จะหาอันที่ไม่เหมือนกันก่อน select a.domain a.pr as pr_A,a.visitor as visitor_A,a.ทีละอันไปจนครบ50, b.pr as pr_B,b.visitor as visitor_B,b.ทีละอันไปจนครบ50 from table a INNER JOIN table b USING(domain) where a.check=4 AND b.check=5 ไม่ทราบเหมือนกันว่าทำไมต้อง inner joinทำไมต้องใช้ usingไม่ใช้ on แต่ลองแล้วมันได้ตามต้องการก็ขอเอาแบบนี้ไปก่อนครับ แล้วผมก็ใช้ while ออกมาเทียบกัน ทำด้วยมือเสียเวลามา ถ้าเก่งๆเรื่อง array หาวิธีเอามาcompareกันได้ คงบรรทัดเดียวจบไปแล้ว.. ตอนนนี้ผมทำแบบ while...{ if($arr[pr_A]!=$arr[pr_B])]){echo 'pr_A เปลี่ยนจาก'.$arr[pr_A].'เป็น'.$arr[pr_B];} if($arr[visitor_A]!=$arr[visitor_B]){echo 'visitor_A เปลี่ยนจาก'.$arr[visitor_A].'เป็น'.$arr[visitor_B];} .. .. .. ผมทำด้วยมือไปอีกจนครับ 50 อันที่ต้องการ } ยังไม่จบนี้เพิ่ง select ครั้งแรก ผมต้องselect อีกทีเพื่อหาว่าอันไหน addหรือdelไป? ไม่ใช่วิธีที่ถูกแต่resultตรงตามที่ผมต้องการ เป็นการแก้ปัญหาเฉพาะหน้าเพื่อข้ามไปทำอย่างอื่นต่อ.. ถ้าได้วิธีที่ดีกว่าผมก็จะกลับไปแก้ครับ..ยังไงก็ขอบคุณทั้งคนมากๆครับ อย่าเพิ่งบลัฟกันเลยครับ ป.ล.เพิ่งเข้าใจคำว่า บลัฟ ทีแรกนึกว่าพิมพ์ผิด ไปsearch gg ดูเจอเป็นหมื่น.. ทำให้รู้ว่าเราตกยุคแล้วนี่.. คำเตือน - มีกระทู้ตอบใหม่ 2 กระทู้ ขณะที่คุณพิมพ์ข้อความ อยากให้คุณแสดงตัวอย่างก่อนตั้งกระทู้ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: siamman ที่ 24 ธันวาคม 2008, 12:43:02 เอาเข้าจริงๆ เวลาโพสเรื่อง php ที่นี่ส่วนใหญ่จะได้คำตอยบที่มาจากประสบการณ์จริงๆ เพราะที่นนี่สวยใหญ่จะทำเวบกันหลายๆเวบ ประสบการณ์เลยเยอะ และมักจะได้คำตอบที่น่าพอใจ
ผมเห็นบอร์ดอื่นดูโหวงเหวงยังงัยไม่รู้ บางทีคำถามที่คิดว่าน่าจะมีคนตอบก็ไม่มีใครตอบ ท่าทางไม่ค่อยว่างกัน สงสัยที่นี่คนตกงานรวมตัวกันเยอะกว่าที่อื่นแฮะ :D หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 24 ธันวาคม 2008, 13:00:00 สงสัยที่นี่คนตกงานรวมตัวกันเยอะกว่าที่อื่นแฮะ :D 555+ ว่าจะพักมือ แต่ขอตอบหน่อย +1 เลย :D ปล. เหตุที่ join ไม่มี on เพราะไม่ได้ต้องการสร้างความสัมพันธ์ระหว่างการ join ปล2. จริงๆ ไม่อยากใช้คำว่าบลัฟเหมือนกัน แต่ไม่รู้จะใช้คำิอะไรดี ^^" (รู้จักแต่คำนี้ เพราะใช้ในวงการค้าเลยเจอบ่อย = =") หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: Seree ที่ 24 ธันวาคม 2008, 15:41:03 ผมเข้าใจว่าต้องการเพิ่มการเปรียบเทียบฟิลด์อื่นๆเข้าไป เช่น "จาก keyword A -> keyword B" และอื่นๆ
ลองแบบนี้ดูนะครับ สำหรับฟิลด์อื่นจะทำคล้ายๆกันครับ เพิ่มไปเรื่อยๆ แต่มันจะยิ่งช้าครับ โค๊ด: select distinct domain, วิธีด้านบนยิ่งเพิ่มจำนวนฟิลด์จะยิ่งช้าครับ ลองอันนี้ดูนะครับว่าผลลัพธ์ได้คล้ายที่ต้องการหรือเปล่า เพราะมันจะเร็วกว่านะครับ โค๊ด: select distinct domain, ลองดูก่อนนะครับว่าได้มั้ย ถ้าได้แล้วจะจบให้ด้วยวิธีทำให้ select count(*) สุดท้ายเหลืออันเดียวครับ ซึ่งจะเร็วขึ้นเยอะครับ (แต่ขอไปลองดูก่อนเพราะปกติทำแต่ใน MS SQL Server น่ะครับ) ผมว่าถ้าข้อมูลมันเยอะๆล่ะก็น่าจะทำในแนวกึ่งๆ data warehouse ดีมั้ยครับ? คือเมื่อมีการ update โดเมน A เกิดขึ้น ก็ให้ไปอัปเดทตัวเลขหรือการเปลี่ยนแปลงต่างๆใน table ที่เอาไว้เก็บผลลัพธ์โดยเฉพาะน่ะครับ จะได้... - ไม่ต้องเสียเวลา query จากข้อมูลเยอะๆ เพราะช้าแน่นอน - ไม่ต้องกังวลเรื่อง index เพราะถ้าสร้าง index เอาไว้เยอะๆเพื่อเวลา query จะได้เร็วๆ เวลาเพิ่ม/แก้ไขข้อมูลก็จะช้ากลับกันอีกครับ ลองดูความเห็นของท่านอื่นด้วยนะครับ ขอบคุณครับ ขอบคุณครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 25 ธันวาคม 2008, 04:17:58 ขอบคุณครับ สงสัยผมควรกลับไปออกแบบฐานข้อมูลใหม่ดีกว่า
ให้เป็นแบบอัปเดทตัวเลขหรือการเปลี่ยนแปลงต่างๆใน table น่าจะเร็วกว่าใช่ไหมครับ เพราะวิธีปัจจุบันมันaddทั้งหมด จริงๆควรจะaddเฉพาะที่มีการเปลี่ยนแปลงและที่ไม่เคยมีในฐานข้อมูล หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 25 ธันวาคม 2008, 04:15:45 ผมลองออกแบบดูใหม่ งั้นก็จะกลายเป็นว่า
จาก TABLE_A 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 ผมมีข้อมูล text ไฟล์ที่ต้องการ add ลง db ---------------------------------------------------------------------------------------------------- google.com|2008-11-02 21:01|search engine,google|2 live.com|2008-11-02 10:17| live,microsoft,search|2 thaiseoboard.com|2008-11-04 11:34|ไทยเสียว,seo,หาเงิน|9 ---------------------------------------------------------------------------------------------------- ผมจะ แบ่งที่ละบรรทัด และ split | ออกได้เป็นชุดๆแล้ว ผมจะเริ่มจาก select max(check) from table_A ก่อนแล้ว เพื่อหาค่าสูงสุดของ check ใน tableนี้ สมมุติว่าเป็น $max_check แล้วผมก็จะไป foreach ค่าที่ได้จาก text ทำทีละบรรทัดเอา แล้วไปselect ที่ละบรรทัดดังนี้ select domain From table_A where domain = $text_domain And check = $max_check if ถ้าselect แล้วไม่มีค่า แสดงว่าเป็นการเพิ่มใหม่ ผมต้องทำ 2 อย่างคือ 1. add ลง table_A โดยมีค่า check=$max_check+1 2. add ลง table_update โดยเก็บค่า $max_check+1 กับชื่อ domainเท่านั้น (ต้องสร้างtableนี้ขึ้นมาใหม่เพื่อ จะได้รู้ว่าdomainอะไรถูกเพิ่มใหม่หรือแก้ไขบ้าง) ผมกำหนดให้ table_update มี field เป็นดังนี้ domain | check | change | fromto else แต่ถ้า selectแล้วมีค่าdomainนั้นๆ แสดงว่าต้องมาตรวจสอบว่าข้อมูลตรงกันทั้งหมดไหม? เป็นไปได้ 2 อย่างคือ 1. ถ้าตรง ต้อง update check (ของ table_a) ให้เป็น $max_check+1 2. แต่ถ้าไม่ตรงแค่ช่องใดช่องหนึ่ง ต้อง add ข้อมูลใหม่เพิ่มเข้าไปทุกช่องทั้งหมด โดยให้ (table_a)มีcheck = $max_check+1 และ ไปเพิ่มข้อมูลใน table_update ด้วย โดยเอาชื่อfieldที่ไม่ตรงกันไปใส่ใน change แล้วเอาค่าไม่ไม่ต้องกันทั้งคู่ไปใส่ใน formtoโดยมีเครื่องหมาย - ขั้น **** ดังนั้น table_a ก็จะกลายเป็น 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 | 5 nipa.com | 2008-11-01 08:23 | nipa,ads,thai | 9 | 4 google.com | 2008-11-02 21:01 | search engine,google | 2 | 5 thaiseoboard.com | 2008-11-04 11:34 | ไทยเสียว,seo,หาเงิน | 9 | 5 คือ live ไม่เปลี่ยนแปลง จึง update check เป็น 5 ส่วน google มี pr จาก1เป็น2 จึงต้อง add ขึ้นมาใหม่ และ thaiseoboard.com เป็นของใหม่จึง addไปเฉยๆ ส่วน table_update ก็จะกลายเป็น domain | check | change | fromto -------------------------------------------------------- google | 5 | pr | 1-2 thaiseoboard | 5 | add | แล้วที่นี้ผมจะรู้ได้ยังไงว่า อะไรถูกลบไปจาก check4ไป check5 ซึ่งจริงๆวิธีผมก็อาจจะ select domain ที่ check=4 ทีละอันไป เทียบกับ check=5 **** แล้วเอาไป add ใน table_update โดยใส่คำว่า del ลงไปในช่อง change table_update ก็จะกลายเป็น domain | check | change | fromto -------------------------------------------------------- google | 5 | pr | 1-2 thaiseoboard | 5 | add | nipa| 5 | del จบครับ ทั้งหมดนี้คือสิ่งที่ผมออกแบบระบบใหม่ ไม่รู้ว่าถูกต้องหรือดีที่สุด หรือเปล่า ในกรณีนี้คือไม่ add textทั้งหมดลงไปใน database แต่จะ add เฉพาะที่เปลี่ยนแปลง database จะเล็กลงเยอะมากๆๆ เพราะข้อมูล text มีหลายบรรทัด จริงๆระบบมันไม่ได้ยากเลย แค่การตรวจสอบการเปลี่ยนแปลงของข้อมูล ปัญหาคือว่า ผมยังไม่เก่ง ทั้ง mysql และ array วิธีของผมคือ select แยกทีละครั้งแล้วมาเทียบกัน จึงอยากขอคำแนะนำว่า ควรทำอย่างไร ให้ออกมาเป็นอย่าง 2 table นี้ครับ และระบบทำงานได้เร็วที่สุด? รบกวนผู้เชียวชาญทุกท่านด้วยครับ ป.ล.ส่วนที่เป็น **** คือผมไม่รู้จะเขียนยังไงครับ หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: google_bb ที่ 25 ธันวาคม 2008, 15:29:19 มาดูครับ
หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 26 ธันวาคม 2008, 00:15:04 ขออนุญาติดันครับ
หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: EThaiZone ที่ 26 ธันวาคม 2008, 00:29:53 ไม่รู้ตอบไงดีแล้วครับ
แบบว่าถามเยอะจนนึกว่าจับมือสอน เป็นอีกครั้งที่ผมยกธงขาว :P ตอบม่ายหว่าย :-X หัวข้อ: Re: [mysql+php] จะเทียบข้อมูลระหว่างrowsในtableเดียวกันยังไงให้เร็วสุดๆ ช่วยด้วยครับ เริ่มหัวข้อโดย: ManyMoney ที่ 26 ธันวาคม 2008, 06:17:45 โทษทีครับ ยอมรับครับว่าถามเยอะไป.. มันยากสำหรับผมมากครับ ข้ามไปก่อนแล้วกันนะครับ..
ผมขอถามสั้นๆครับ อีก1คำถามครับ จากตารางนี้ id | phone | gp | sub | rate | ----------------------------------------------- 1 | 0241234567 | A | Less | 150 2 | 0241234567 | B | More | 49 3 | 0241234567 | A | Less | 200 ผมต้องการselect แถวที่มี phone,gp,sub ซ้ำกัน ให้ได้ id=1และ3 ต้องเขียนยังไงครับ |