คือผมมีหน้า show.php นะครับ เอาไว้ query ข้อมูล member มาโชว์(พวกชื่อ, อีเมล์, อื่นๆ)
แบบ1 ขอยกตัวอย่างฟิลด์สั้นๆนะครับ ตอนนี้ใช้ใน show.php
== เก็ท topicid จาก url ==
$topicid = intval($_GET['topicid']);
SELECT topic
.memberid
FORM topic
WHERE topic
.topicid = '$topicid'";
== แล้วเอาค่า memberid จากตาราง topic มาดึง profile ==
SELECT member
.name,member
.email,field อีกเยอะ
FORM member
WHERE member
.mid = 'member_id'";
=================================
แบบ2 จะเปลี่ยนเป็นเขียนฟังก์ชั่นใส่ function.inc.php
function select_profile($field,$memberid){
$s_profile="SELECT member
.$field
FORM member
WHERE member
.mid = '$memberid'";
$q_profile=mysql_query($s_profile);
$f_profile=mysql_fetch_array($s_profile);
mysql_free_result($q_profile);
return $f_profile['$field'];
}
== ใน show.php ก็เรียกใช้ฟังก์ชั่น ==
select_profile(field_name,memberid);
select_profile(field_email,memberid);
select_profile(field_phone,memberid);
select_profile(field_ip,memberid);
......เรียกฟังก์ชั่น เพื่อดึงค่าอีกเยอะ
อยากถามว่าแบบฟังก์ชั่น เท่ากับเรา SELECT DB หลายๆครั้งใช่ไหมครับ แสดงว่าแบบ1 ดีกว่า เพราะ SELECT DB ครั้งเดียว
ปล.โค้ดผิดก็ผ่านก่อนนะครับ เพราะเขียนสดใส่บล๊อกนันเลย ^_____^"
ทำไมไม่เว้นบันทัด T______________T"
คิดง่ายๆครับสมมติถ้ามี 10 fields
แบบแรก DB ต้องตอบ 1(2) ครั้ง
แบบสอง DB ต้องตอบ 10 ครั้ง
ยังไม่นับเรื่องที่ server ต้อง handle อีกนะครับ
ปล. แบบแรกยังสั้นได้อีกนะครับ แต่ก็แล้วแต่ความต้องการ/ความ complex ของงานล่ะนะ
อันแรก ดึงสองครั้งเลยครับ
อันที่สอง ดึงที่ละฟิลค์เลย โหดขิงๆ
ลองคิดดูว่า ถ้าต้องการดึงข้อมูลของ member 5 คน คนละมาสัก 20 ฟิลด์อันใหนมันจะเร็วกว่ากัน หรือไม่ก็ลองcodดูครับ จะได้เข้าใจอย่างถ่องแท้
555 แสดงว่าใช้แบบ1 ดีกว่า
โค้ดผิดจริงด้วย ถามเสร็จ ไปลองเขียนฟังก์ชั่น สรุปมัน return ไม่ออก....เพราะเขียน FORM ผิด 555
งั้นใช้แบบเดิมดีกว่า อิอิ ขอบคุณมากๆ
ใช้คำสั่ง left outer join ดู
SELECT topic.*,member.* FROM topic topic LEFT OUTER JOIN member member ON topic.memberid=member.mid WHERE topic.topicid = '$topicid'";
พวก JOIN นี่ผมเข็ดเลยล่ะครับ เคยทำเว็บโฆษณาฟรี row เพียบ(ทั้ง topic, pic, member, บลาๆ).
สุดท้ายลองนั่งแก้โค้ด JOIN เป็น SELECT ตารางต่อๆกัน การโหลดหน้าเว็บไวขึ้นเยอะ.
ผมว่า JOIN มันจะอืดกว่า SELECT ตารางต่อๆกันน่ะครับ(เจอมากับตัวนะ เลยกล้าพูดได้เต็มปาก ^____^")
ปล.ลองอัดข้อมูลเข้าดีบีสัก 10,000-50,000 row แล้วเทียบโค้ดดูครับ(แต่ใครทำเว็บ ไม่มีสมาชิกก็ใช้ JOIN จะสะดวกกว่า โค้ดอ่านง่าย)
join แล้วไม่มี index ตัวที่ join หรือเปล่าครับ
นั่นแหละครับ ปัญหาของคนที่ยังไม่รู้จัก database ดีพอ
ไปศึกษาเรื่อง Index ก่อนครับ ส่วนการ Query ที่มี pattern Syntax เหมือนเดิมนั้น DBMS มันมี Caching อยู่แล้ว
Texion Business Solutions
INDEX DB ผมทำเกือบทุกฟิลด์(ในทุกตาราง)ล่ะครับ เอาเน้นๆก็ฟิลด์ที่ใช้ WHERE แบบนี้ผมทำถูกวิธีหรือป่าว ถ้าไม่ถูกช่วยแนะนำมผมที
อินเด็กผมทำแบบนี้ถูกป่าวหรอครับ ก๊อปมาสั้นๆ แล้วทำในตารางทุกตารางด้วย ดูใน phpmyadmin มันก็โชว์ว่าทำอินเด็กแล้วนะ
PRIMARY KEY (
abuse_id
),KEY
type
(type
),KEY
id
(id
),KEY
mid
(mid
),KEY
ip
(ip
)เอาง่ายๆว่า ตัวที่ join กันต้องเป็น key
select something from yyy left join xxx on xxx.key1 = yyy.key2 where....
ไม่งั้นก็ใช้คำสั่ง IN คับ Select id จากtable แรก เก็บเป็น array แล้วค่อย เอาไป IN ใน Select tableที่2
---- ลบ ----
เอาใหม่อ่าน Query ไม่ครบ
แบบแรก จะให้ดี JOIN เลยครับ
ถ้ากลัวช้า EXPLAIN QUERY ก่อน จะดูได้ว่า Index ที่ทำ Impact ไหมครับ
อย่ากลัวการ JOIN เลยครับ พอมี INDEX จะเห็นผลอย่างชัดเจนครับ
แบบที่สอง อย่าทำเลยครับ มันบาป สงสาร Database (^ ^)
ลองไปอ่านดูเรื่อง Database round trip จะเข้าใจครับ
แนะนำอีกอย่างครับ อาจจะไม่เกี่ยวกับกับที่จั่วหัวมาเท่าไหร่
แต่เห็นใส่ parameter ลงไปใน Query ตรงๆ เห็นแล้วหงุดหงิดแทน
ระวัง SQL Inject นะครับ
ลองดูคำสั่งพวก input filter นะครับ
แล้วก็ escape query parameter ด้วยคำสั่งตระกูล mysql_escape_* ดูนะครับ
ไม่ทำระวังจะร้องไห้ (T_T)
พวก action ผมใส่ mysql_real_escape_string($value); ก่อน INSERT แล้วครับ น่าจะกันได้พอควร ถ้าไม่เจอเทพแฮก ^_____^"
ส่วนเก็ทไอดีจาก url บางทีก็เอาเข้า intval ก่อน
ไม่เห็นมีใครแนะนำผมเลยว่าโค้ด INDEX DB ของผมถูกป่าว ใครมาถามผม ผมจะได้ตอบได้ถูกต้อง.
อยากรู้ Index ถูกไหม ลอง Explain Query ดูครับ
ลองดูง่ายๆก่อนว่า Query เป็นแบบไหน Full scan หรือเปล่า
ส่วน Index ของคุณตอนนี้มันดึง 1 row 1 query where 1 field
index ที่เขียนมาคงไม่ผิดหรอกครับ
แต่อย่างที่บอก join เถอะครับ จะได้ไม่เป็นภาระของลูกหลาน
โปรแกรมที่เขียนเมื่อ 7 ปีที่แล้ว ลูกค้ายังให้ผม MA อยู่เลย
ทำดีๆไว้ตอนนี้ วันหน้าจะได้ไม่เหนื่อยมาก
คำพูดที่บอกว่า "มีเวลาไว้ค่อยทำ" ไอ้เจ้าเวลาเนี่ย หายากมากครับ
น้อยนักที่จะมีโอกาสหาเวลากลับมาทำ
รบกวนถามเป็นความรู้หน่อยนะครับ ปกติไม่ค่อยได้ใช้ mysql เท่าไหร่ อยากรู้มานานแล้วว่า tool ที่ใช้ดู explain plan ใน mysql มีรึเปล่าครับ ถ้ามีช่วยแนะนำด้วยครับ
ลองดูนะครับ ;)
http://dev.mysql.com/doc/refman/5.6/en/explain.html
http://dev.mysql.com/doc/refman/5.6/en/explain-output.html#explain-output-columns
ผมใช้ prepared statements
+1
อ่าาาครับ ขอบคุณทุกคนมากๆครับ เดี๋ยวผมลองไปหาอ่าน prepared statements ไม่รู้มันคืออะไร 555+
ส่วน IN() มันแทน JOIN หรือ SELECT ได้หรอครับ ผมดูๆแล้วเหมือนแค่ใช้ในตารางเดียวกัน แต่....โค้ดนี้ทำให้ผมทำระบบ like สำเร็จ อิอิ ขอบคุณมากมาย ^____^
อ่านเจอวิธีลด SELECT อีกหนึ่งทางคือ....เอาพวก displayname ใส่ไปกับตาราง title หรือ reply ด้วยเลย. แต่เวลาสาชิกแก้โปรไฟล์ก็ต้องเพิ่มโค้ดแก้จุดนี้ตามด้วย แต่ก็ถือว่าช่วยลด SELECT ได้ดีพอควร เพราะไม่มีใครแก้โปรไฟล์บ่อยๆหรอกเนอะ.