 |
|
|
 |
 |
|
Code (PHP)
$qr=mysql_query("select Id from A where Name like '%".$key."%'");
$rs=mysql_fetch_array($qr);
$id = $rs['Id'];
$qy=mysql_query("select * from B where Id in('".$id."')");
ถ้าผลไม่ได้ ก็คงผิดที่ $qy หล่ะครับ
|
 |
 |
 |
 |
Date :
2010-07-16 14:16:33 |
By :
50121680 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่ได้ครับยังคงได้ record เดียวอยู่
|
 |
 |
 |
 |
Date :
2010-07-16 14:21:21 |
By :
tinthai |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใครก็ได้ช่วยด้วยครับ
|
 |
 |
 |
 |
Date :
2010-07-16 15:12:33 |
By :
tinthai |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ทำไมต้องใช้ in ด้วยครับมี Id มากกว่าหนึ่งเปล่าครับ
กรณี Id ของ A ออกมาแค่หนึ่งตัว
Code (PHP)
$qr=mysql_query("select Id from A where Name like '%$key%'");
if(mysql_num_rows($qr)>0){
$rs=mysql_fetch_array($qr);
$qy=mysql_query("select * from B where Id = '$rs[id]' ");
}
กรณี Id ของ A ออกมาหลายตัว
Code (PHP)
$qr=mysql_query("select Id from A where Name like '%$key%'");
if(mysql_num_rows($qr)>0){
$val="0";
while($rs=mysql_fetch_array($qr)){
$val.=",'$rs[Id]' "
}
$qy=mysql_query("select * from B where Id in ($val) ");
}
|
 |
 |
 |
 |
Date :
2010-07-16 15:20:49 |
By :
xbeginner01 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ได้แล้วครับ
Code (PHP)
$qr=mysql_query("select Id from A where Name like '%".$key."%'");
while($rs=mysql_fetch_array($qr))
$id.=",'"$rs['Id']."'"; // ทำให้ข้อมูลให้อยู่ในรูปแบบ ,'1','2','3',4'....
$id=substr($id,1); // ตัด , ตัวแรกออก
$qy=mysql_query("select * from B where Id in(".$id.")");
ใครเจอปัญหาแบบผมเอาไปใช้เลยครับ และขอบคุณคุณ xbeginner01 และ Gusto ที่ช่วยตอบครับ
|
 |
 |
 |
 |
Date :
2010-07-16 15:21:38 |
By :
tinthai |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แล้วทำไมใช้ join ไม่ได้ละคะ
Join ผิดอะไรหรอ
|
 |
 |
 |
 |
Date :
2010-07-16 15:23:47 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
บทความน่าสนใจมากครับ
ถูกล้างสมองให้ใช้ join เหมือนกันครับ แต่ขอโต้แย้งข้อนี้หน่อย
- ใครว่า join เขียนง่ายครับ เขียนยากออก ยิ่ง join กันหลายตารางอีก แล้ว join แบบไม่มีข้อมูลอีก
ไม่มีข้อโต้แย้งเรื่องอื่นที่เขาพูดมาเลย เอิ้กๆ มันก็จริงต้องประสบการณ์ล้วนๆ เดี๋ยวลองทดสอบบ้างละกัน ไม่ค่อยอยากจะเขียน join เหมือนกัน
แต่เท่าที่เห็นเว็บดังๆหลายแห่งก็ใช้ join ซะเป็นส่วนใหญ่นะ การที่ใช้ join ก็ต้องมีเหตุผลบ้างแหล่ะ
ใครมีประสบการณ์ก็บอกหน่อยละกันครับจะได้เก็บข้อมูล   
|
 |
 |
 |
 |
Date :
2010-07-16 16:18:07 |
By :
xbeginner01 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ตั้งแต่เกิดมา เคยเรียนการใช้ JOIN แต่ไม่เคยนำ JOIN ไปใช้เลยแม้แต่นิดเดียว
|
 |
 |
 |
 |
Date :
2010-07-16 16:25:34 |
By :
50121680 |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ผมว่าถ้ามันซับซ้อนมากๆก็คงต้องใช้แหละครับ แต่ของผมมันไม่ซับซ้อนขนาดต้องใช้อ่ะครับ
|
 |
 |
 |
 |
Date :
2010-07-16 16:45:20 |
By :
tinthai |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ใช้ join แล้วเวลามีคนเข้าดูข้อมูลเยอะๆ server จะทำงานหนักครับ
ดูได้จากที่นี่ครับ
http://www.myblog.in.th/2008/05/15/mysql-join-table-effect/
ผมต้องขอแย้งกับบทความนี้นะครับ เพราะเท่าที่ผมเจอมาคิดว่าการ join อาจจะทำให้ cpu ทำงานหนักขึ้นก็จริงอยู่ แต่ก็ขึ้นกับการออกแบบ database ด้วยผมเคยทำงานอยู่เว็บแห่งหนึ่ง UIP ประมาณ 3 หมื่น ใช้ join ระบบล่มทันที่ แต่ว่า database ที่เค้าออกแบบมาก่อนที่ผมจะเข้าไปทำงานนั้น เค้าใช้ field ที่เป็น vachar ในการ compare ตอน join ครับ ซึ่งจุดนี้ก็น่าจะเป็นปัญหาที่หนักอยู่เหมือนกันกับการ jion แล้วผมทำเว็บอีกตัวนึง UIP ก็ หมื่นๆ กว่าๆ ผมก็ใช้ join ไม่เป็นมีปัญหาอะไรเลยครับ การ join ก็มีหลายรูปแบบ อีกเหมือนกัน บางคนก็แค่ compare ธรรมดาเช่น
SELECT a.aa, b.aa, b.bb FROM a, b WHERE a.aa=b.aa
กับ
SELECT a.aa, b.aa, b.bb FROM a LEFT JOIN b ON a.aa=b.aa
ก็ได้ผลต่างกันแล้วนะครับ ไม่เชื่อลองหาวิธีทดสอบดูคครับ แต่ต้อง insert ข้อมูลเยอะๆ หน่อย นะครับ สัก แสนสองแสน record แล้วจะเห็นผล
แล้วอีกอย่างผมใช้ smf เข้าไปดูโค้ด ข้างในเค้ายังใช้ join เลยครับ
ตัวอย่างโค้ดการ join จาก smf
// Find all boards and categories, as well as related information. This will be sorted by the natural order of boards and categories, which we control.
$result_boards = $smcFunc['db_query']('boardindex_fetch_boards', '
SELECT' . ($boardIndexOptions['include_categories'] ? '
c.id_cat, c.name AS cat_name,' : '') . '
b.id_board, b.name AS board_name, b.description,
CASE WHEN b.redirect != {string:blank_string} THEN 1 ELSE 0 END AS is_redirect,
b.num_posts, b.num_topics, b.unapproved_posts, b.unapproved_topics, b.id_parent,
IFNULL(m.poster_time, 0) AS poster_time, IFNULL(mem.member_name, m.poster_name) AS poster_name,
m.subject, m.id_topic, IFNULL(mem.real_name, m.poster_name) AS real_name,
' . ($user_info['is_guest'] ? ' 1 AS is_read, 0 AS new_from,' : '
(IFNULL(lb.id_msg, 0) >= b.id_msg_updated) AS is_read, IFNULL(lb.id_msg, -1) + 1 AS new_from,' . ($boardIndexOptions['include_categories'] ? '
c.can_collapse, IFNULL(cc.id_member, 0) AS is_collapsed,' : '')) . '
IFNULL(mem.id_member, 0) AS id_member, m.id_msg,
IFNULL(mods_mem.id_member, 0) AS id_moderator, mods_mem.real_name AS mod_real_name
FROM {db_prefix}boards AS b' . ($boardIndexOptions['include_categories'] ? '
LEFT JOIN {db_prefix}categories AS c ON (c.id_cat = b.id_cat)' : '') . '
LEFT JOIN {db_prefix}messages AS m ON (m.id_msg = b.id_last_msg)
LEFT JOIN {db_prefix}members AS mem ON (mem.id_member = m.id_member)' . ($user_info['is_guest'] ? '' : '
LEFT JOIN {db_prefix}log_boards AS lb ON (lb.id_board = b.id_board AND lb.id_member = {int:current_member})' . ($boardIndexOptions['include_categories'] ? '
LEFT JOIN {db_prefix}collapsed_categories AS cc ON (cc.id_cat = c.id_cat AND cc.id_member = {int:current_member})' : '')) . '
LEFT JOIN {db_prefix}moderators AS mods ON (mods.id_board = b.id_board)
LEFT JOIN {db_prefix}members AS mods_mem ON (mods_mem.id_member = mods.id_member)
WHERE {query_see_board}' . (empty($boardIndexOptions['countChildPosts']) ? (empty($boardIndexOptions['base_level']) ? '' : '
AND b.child_level >= {int:child_level}') : '
AND b.child_level BETWEEN ' . $boardIndexOptions['base_level'] . ' AND ' . ($boardIndexOptions['base_level'] + 1)),
array(
'current_member' => $user_info['id'],
'child_level' => $boardIndexOptions['base_level'],
'blank_string' => '',
)
);
ปล. ผมคิดว่าอยู่ทีการออกแบบ database มากกว่าที่จะเป็นเพราะคำสั่งข join คนที่คิดคำสั่งพวกนี้ logic เค้าขั้นเทพครับ ผมเชื่ออย่างนั้นนะ
|
 |
 |
 |
 |
Date :
2010-07-18 13:04:01 |
By :
DownsTream |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ไม่รู้นะระหว่างการ Join กับการลูป อันไหนจะกินแรมเยอะกว่ากัน อันไหนจะเดี้ยงไวกว่ากัน แต่บางครั้งมันก็ไม่ได้ติดที่ join แต่ไปหนักที่ order มากกว่า แต่ก็ไม่ใช่ว่า join จะไม่ทำให้ช้าถ้า join ฟิลด์ที่ไม่ใช่ index ก็ช้าเหมือนกัน อันนี้ก็ประสบการณ์อันน้อยนิดของผมเหมือนกัน หรือว่าผมยังไม่เคยจับระบบใหญ่ยักษ์เหมือนชาวบ้านเค้าน้อ
|
 |
 |
 |
 |
Date :
2010-07-18 13:26:56 |
By :
PlaKriM |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
ก้อไปจับมั่งดิคะพี่ปาการิม
|
 |
 |
 |
 |
Date :
2010-07-18 16:27:56 |
By :
blurEyes |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
เคยลองเปลี่ยนการ join ตารางสองตารางประมาณสองหมื่น record มาเป็นการเก็บ array มาใส่ใน query ถัดไป มาเปรียบเทียบกัน แบบใส่ array วนลูปเอาเองจะทำเวลาดีขึ้นประมาณ 5-10%
แต่เคยได้ทราบมาการ join หรือแยกเป็นสอง query ไม่ได้มีแบบไหนดีกว่ากันในทุกกรณี
|
 |
 |
 |
 |
Date :
2010-07-19 03:35:07 |
By :
:) |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
 |
|
|
 |
 |
|
แวะมาดูด้วยคน 
|
 |
 |
 |
 |
Date :
2010-07-19 09:07:36 |
By :
SOUL |
|
 |
 |
 |
 |
|
|
 |
 |
|
 |
 |
|