Tags:

คือผมมีหน้า 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 ครั้งเดียว

ปล.โค้ดผิดก็ผ่านก่อนนะครับ เพราะเขียนสดใส่บล๊อกนันเลย ^_____^"

Get latest news from Blognone
By: KonIndy on 8 February 2013 - 15:44 #538889

ทำไมไม่เว้นบันทัด T______________T"

By: cornario
iPhoneAndroidUbuntuWindows
on 8 February 2013 - 16:58 #538905
cornario's picture

คิดง่ายๆครับสมมติถ้ามี 10 fields
แบบแรก DB ต้องตอบ 1(2) ครั้ง
แบบสอง DB ต้องตอบ 10 ครั้ง
ยังไม่นับเรื่องที่ server ต้อง handle อีกนะครับ
ปล. แบบแรกยังสั้นได้อีกนะครับ แต่ก็แล้วแต่ความต้องการ/ความ complex ของงานล่ะนะ

By: adente
ContributorSUSESymbianWindows
on 8 February 2013 - 17:01 #538907
adente's picture

อันแรก ดึงสองครั้งเลยครับ

อันที่สอง ดึงที่ละฟิลค์เลย โหดขิงๆ

ลองคิดดูว่า ถ้าต้องการดึงข้อมูลของ member 5 คน คนละมาสัก 20 ฟิลด์อันใหนมันจะเร็วกว่ากัน หรือไม่ก็ลองcodดูครับ จะได้เข้าใจอย่างถ่องแท้

By: KonIndy on 8 February 2013 - 17:25 #538914

555 แสดงว่าใช้แบบ1 ดีกว่า

โค้ดผิดจริงด้วย ถามเสร็จ ไปลองเขียนฟังก์ชั่น สรุปมัน return ไม่ออก....เพราะเขียน FORM ผิด 555

งั้นใช้แบบเดิมดีกว่า อิอิ ขอบคุณมากๆ

By: srel90
iPhoneWindows PhoneAndroidUbuntu
on 8 February 2013 - 17:27 #538915

ใช้คำสั่ง left outer join ดู

By: srel90
iPhoneWindows PhoneAndroidUbuntu
on 8 February 2013 - 17:33 #538916

SELECT topic.*,member.* FROM topic topic LEFT OUTER JOIN member member ON topic.memberid=member.mid WHERE topic.topicid = '$topicid'";

By: KonIndy on 8 February 2013 - 17:51 #538922

พวก JOIN นี่ผมเข็ดเลยล่ะครับ เคยทำเว็บโฆษณาฟรี row เพียบ(ทั้ง topic, pic, member, บลาๆ).

สุดท้ายลองนั่งแก้โค้ด JOIN เป็น SELECT ตารางต่อๆกัน การโหลดหน้าเว็บไวขึ้นเยอะ.

ผมว่า JOIN มันจะอืดกว่า SELECT ตารางต่อๆกันน่ะครับ(เจอมากับตัวนะ เลยกล้าพูดได้เต็มปาก ^____^")

ปล.ลองอัดข้อมูลเข้าดีบีสัก 10,000-50,000 row แล้วเทียบโค้ดดูครับ(แต่ใครทำเว็บ ไม่มีสมาชิกก็ใช้ JOIN จะสะดวกกว่า โค้ดอ่านง่าย)

By: adente
ContributorSUSESymbianWindows
on 8 February 2013 - 18:10 #538929 Reply to:538922
adente's picture

join แล้วไม่มี index ตัวที่ join หรือเปล่าครับ

By: massacre
AndroidUbuntu
on 8 February 2013 - 18:12 #538930 Reply to:538929

นั่นแหละครับ ปัญหาของคนที่ยังไม่รู้จัก database ดีพอ

By: figgaro
ContributorAndroidWindows
on 8 February 2013 - 18:59 #538943 Reply to:538922
figgaro's picture

ไปศึกษาเรื่อง Index ก่อนครับ ส่วนการ Query ที่มี pattern Syntax เหมือนเดิมนั้น DBMS มันมี Caching อยู่แล้ว


Texion Business Solutions

By: KonIndy on 8 February 2013 - 19:26 #538947

INDEX DB ผมทำเกือบทุกฟิลด์(ในทุกตาราง)ล่ะครับ เอาเน้นๆก็ฟิลด์ที่ใช้ WHERE แบบนี้ผมทำถูกวิธีหรือป่าว ถ้าไม่ถูกช่วยแนะนำมผมที

By: KonIndy on 8 February 2013 - 19:33 #538948 Reply to:538947

อินเด็กผมทำแบบนี้ถูกป่าวหรอครับ ก๊อปมาสั้นๆ แล้วทำในตารางทุกตารางด้วย ดูใน phpmyadmin มันก็โชว์ว่าทำอินเด็กแล้วนะ

PRIMARY KEY (abuse_id),

KEY type (type),

KEY id (id),

KEY mid (mid),

KEY ip (ip)

By: adente
ContributorSUSESymbianWindows
on 8 February 2013 - 22:50 #538988 Reply to:538947
adente's picture

เอาง่ายๆว่า ตัวที่ join กันต้องเป็น key
select something from yyy left join xxx on xxx.key1 = yyy.key2 where....

By: srel90
iPhoneWindows PhoneAndroidUbuntu
on 8 February 2013 - 21:35 #538972

ไม่งั้นก็ใช้คำสั่ง IN คับ Select id จากtable แรก เก็บเป็น array แล้วค่อย เอาไป IN ใน Select tableที่2

By: mahasak
iPhoneUbuntu
on 8 February 2013 - 23:41 #538999

---- ลบ ----
เอาใหม่อ่าน Query ไม่ครบ

แบบแรก จะให้ดี JOIN เลยครับ
ถ้ากลัวช้า EXPLAIN QUERY ก่อน จะดูได้ว่า Index ที่ทำ Impact ไหมครับ
อย่ากลัวการ JOIN เลยครับ พอมี INDEX จะเห็นผลอย่างชัดเจนครับ

แบบที่สอง อย่าทำเลยครับ มันบาป สงสาร Database (^ ^)
ลองไปอ่านดูเรื่อง Database round trip จะเข้าใจครับ

By: mahasak
iPhoneUbuntu
on 8 February 2013 - 23:34 #539000

แนะนำอีกอย่างครับ อาจจะไม่เกี่ยวกับกับที่จั่วหัวมาเท่าไหร่
แต่เห็นใส่ parameter ลงไปใน Query ตรงๆ เห็นแล้วหงุดหงิดแทน
ระวัง SQL Inject นะครับ
ลองดูคำสั่งพวก input filter นะครับ
แล้วก็ escape query parameter ด้วยคำสั่งตระกูล mysql_escape_* ดูนะครับ
ไม่ทำระวังจะร้องไห้ (T_T)

By: KonIndy on 9 February 2013 - 12:39 #539111 Reply to:539000

พวก action ผมใส่ mysql_real_escape_string($value); ก่อน INSERT แล้วครับ น่าจะกันได้พอควร ถ้าไม่เจอเทพแฮก ^_____^"

ส่วนเก็ทไอดีจาก url บางทีก็เอาเข้า intval ก่อน

ไม่เห็นมีใครแนะนำผมเลยว่าโค้ด INDEX DB ของผมถูกป่าว ใครมาถามผม ผมจะได้ตอบได้ถูกต้อง.

By: mahasak
iPhoneUbuntu
on 10 February 2013 - 00:41 #539295 Reply to:539111

อยากรู้ Index ถูกไหม ลอง Explain Query ดูครับ
ลองดูง่ายๆก่อนว่า Query เป็นแบบไหน Full scan หรือเปล่า
ส่วน Index ของคุณตอนนี้มันดึง 1 row 1 query where 1 field
index ที่เขียนมาคงไม่ผิดหรอกครับ
แต่อย่างที่บอก join เถอะครับ จะได้ไม่เป็นภาระของลูกหลาน
โปรแกรมที่เขียนเมื่อ 7 ปีที่แล้ว ลูกค้ายังให้ผม MA อยู่เลย
ทำดีๆไว้ตอนนี้ วันหน้าจะได้ไม่เหนื่อยมาก
คำพูดที่บอกว่า "มีเวลาไว้ค่อยทำ" ไอ้เจ้าเวลาเนี่ย หายากมากครับ
น้อยนักที่จะมีโอกาสหาเวลากลับมาทำ

By: olosol@hotmail.com
iPhoneWindows PhoneAndroidBlackberry
on 10 February 2013 - 15:29 #539385 Reply to:539295

รบกวนถามเป็นความรู้หน่อยนะครับ ปกติไม่ค่อยได้ใช้ mysql เท่าไหร่ อยากรู้มานานแล้วว่า tool ที่ใช้ดู explain plan ใน mysql มีรึเปล่าครับ ถ้ามีช่วยแนะนำด้วยครับ

By: platezero on 12 February 2013 - 11:39 #540057 Reply to:539385

ลองดูนะครับ ;)

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

By: hiddenmin
AndroidUbuntuWindows
on 9 February 2013 - 18:01 #539184 Reply to:539000
hiddenmin's picture

ผมใช้ prepared statements

By: platezero on 12 February 2013 - 16:42 #540154 Reply to:539184

+1

By: KonIndy on 13 February 2013 - 14:51 #540469

อ่าาาครับ ขอบคุณทุกคนมากๆครับ เดี๋ยวผมลองไปหาอ่าน prepared statements ไม่รู้มันคืออะไร 555+

ส่วน IN() มันแทน JOIN หรือ SELECT ได้หรอครับ ผมดูๆแล้วเหมือนแค่ใช้ในตารางเดียวกัน แต่....โค้ดนี้ทำให้ผมทำระบบ like สำเร็จ อิอิ ขอบคุณมากมาย ^____^

อ่านเจอวิธีลด SELECT อีกหนึ่งทางคือ....เอาพวก displayname ใส่ไปกับตาราง title หรือ reply ด้วยเลย. แต่เวลาสาชิกแก้โปรไฟล์ก็ต้องเพิ่มโค้ดแก้จุดนี้ตามด้วย แต่ก็ถือว่าช่วยลด SELECT ได้ดีพอควร เพราะไม่มีใครแก้โปรไฟล์บ่อยๆหรอกเนอะ.