A-AA+then

query หลักแสน

1,459
ขอความรู้หน่อยครับ
หากเราต้องการ query ข้อมูลหลักแสน records สำหรับ dropdown มีวิธีไหนที่จะ query เร็วๆ บ้างครับ

10 ความคิดเห็น

ไม่มีครับ

ว่าแต่ แสน record จะ หากันเจอมั้ยเนี่ย...

โดยปกติ ก็ควรจัด query เพื่อทำการสรุปข้อมูลออกมาก่อนแหละครับ เพื่อลดจำนวนข้อมูลที่ต้องการออกให้เหลือน้อยที่สุด หรือ อาจใช้วิธีการสร้าง View ก้ได้ครับ
1

    หาเจอครับ ใน ie จะ not responding ก่อน ถึงจะโหลดได้ แต่ในบางเครื่องก็ไม่ได้ 
    ฟอร์มหน้านั้นเลยอืดมาก
    
    ขอบคุณครับ

2

ก็คงใช่แหละครับ..

ปัญหาคงไม่ได้อยู่ที่ query จาก Server เพียงอย่างเดียวครับ จำนวนข้อมูลที่มากมายขนาดนั้น  จะทำให้เว็บโหลดช้า จนถึงทำงานช้าได้ครับ
3

อย่าว่าแต่แสนเลยครับแค่ 5000 ก็ค้างแล้ว
4

    โดยส่วนตัวมองว่าไม่ควรเอารายการมากขนาดนั้นมาไว้ในดรอบดาวน์ (ไม่ทราบเหมือนกันว่าจำเป็นอย่างไร) ถ้าต้องการเอารายการมาใส่ดรอบดาวน์ น่าจะใส่เงื่อนไขที่พอเพียงสำหรับงานนั้นๆ เพื่อลดปริมาณรายการลง แล้วยังทำให้ผู้ใช้งานสะดวกขึ้นด้วย....
    
    ก่อนจะมาเป็นดรอบดาวน์อันนี้ น่าจะให้ผู้ใช้ระบุข้อมูลให้แคบลงก่อนน่าจะดีกว่านะครับ หรือถ้ามันไม่สามารถระบุให้แคบลงได้ ก็ใช้หน้าของการเลือกข้อมูลแสนรายการนี้เป็นการดำเนินการขั้นตอนก่อนจะไปหน้าต่อไปก็ได้
    
    ผมมองว่าการคอนเนคชั่นบ่อยๆ น่าจะดีกว่าคิวรี่นานๆ ทั้งนี้ขึ้นอยู่กับระบบแต่ละระบบนะครับ

5

มีคำแนะนำเพิ่มเติมนะครับ...

อาจใช้วิธีการโหลดด้วย Ajax ก็ได้นะครับ โดยการใช้หลักการเหมือน จังหวัด อำเภอ ตำบล ด้วย Ajax โดยการแบ่งกลุ่มของข้อมูลออกเป็นกลุ่มๆ (แล้วแต่ความสัมพันธ์ของข้อมูล) หรือ ถ้าหาความสัมพันธ์ไม่ได้ อาจต้องใช้วิธีแบ่งตามตัวอักษร ก้ได้ครับ

คำแนะนำที่จำเป็น เพื่อให้โหลดเร็ว และหาข้อมูลที่ต้องการได้ง่าย ควรจัดแบ่งกลุ่มของข้อมูลออกเป็นกลุ่มย่อยๆ ให้ข้อมูลในแต่ละกลุ่มเล็กที่สุด อาจจะมีหลายๆกลุ่มก็ได้ โดยพยายามดูจากพฤติกรรมของผู้ใช้ (เดา) ว่าผู้ใช้ น่าจะพยายามมองหาข้อมูลอะไรก่อน เป็นลำดับจาก dropdown

ยกตัวอย่างเช่น การหาตำบล ควรเริ่มจาก การหาจังหวัดก่อน แล้วก็ไปเลือกอำเภอ แล้วจึงไปเลือกตำบล ซึ่งจะทำให้หาง่ายกว่า การแสดงรายการตำบลทั้ง 77 จั้งหวัด ในลิสต์รายการเดียวให้หา 
6

    ข้อมูลที่นำมาใช้เป็นข้อมูลของชื่อเรือครับ ไม่สามารถคัดกรองได้ เวลาหาก้อหาทั้งหมดทีเดียว
    
    กำลังคิดถึงวิธีของการทำ autocomplete ครับ แต่ในเว็บนี้ เท่าที่หาดูยังไม่มีครับ(รึเปล่า)
    ลองหาจากข้างนอก ก้อมีเยอะ แต่ที่ใช้กับภาษาไทยได้ยังไม่มี
    มีคำแนะนำเกี่ยวกับเรื่องนี้มั๊ยครับ
    
    หรืออีกวิธีนึงก้อคือทำ popup ขึ้นมาให้เลือกแล้ว return ค่ากลับมายัง main form
    เท่าที่คิดได้ตอนนี้ครับ

7

http://www.goragod.com/knowledge/2/บทที่%209%20การค้นหาข้อความด้วย%20AJAX.html

ถ้าเป็นชื่อเรือ (มีเป็นแสนชื่อเลยรึ) คำตอบที่ 6 ก็น่าจะช่วยได้นะครัับ โดยการ

ใช้ select 2 ตัว ตัวแรก แสดงรายการตัวอักษร A-Z ไว้
ตัวที่ 2 รอรับข้อมูลจากตัวแรก โดยเมื่อเลือก ตัว แรก ไปที่รายการตัวอักษร A (สมมุติ) ก็ใช้ Ajax โหลดข้อมูลชื่อเรือ ที่ขึ้นต้นด้วย A มาแสดงในลิสต์ตัว ที่ 2

ข้อดีเห็นๆ คือ ครั้งแรกที่เรียก ไม่ต้องโหลดข้อมูล เพราะ select ตัวแรก แสดงแค่ A-Z ซึ่งคงที่ (อาจเป็น ก-ฮ ก็ได้) ดังนั้น เว็บไม่ค้าง 100%
ข้อดีที่ 2 คือ เมื่อเลือกตัวอักษร ข้อมูลที่โหลด จะไม่เำำยอะนัก เพราะจะคัดเลือกแค่เรือที่ขึ้นต้นด้วยตัวอักษรที่ต้องการเท่านั้น มาแสดง
8

query หลักแสน

    ขอบคุณครับ
    
    ตอนนี้ผมเปลี่ยนจาก dropdown มาเป็น auto complete แล้วครับ ก็ได้ผลดีขึ้นเยอะ หลักการทำงานก็เหมือนกับ คห.8 คือหาจากตัวแรกก่อนแล้วจากนั้นก้อหาจากกลุ่มของชุดแรกที่ค้นเจอ
    
    แต่ทีนี้ติดปัญหานิดนึงครับ
    ทดสอบกับ google chrome สามารถแสดงรายการได้ปกติ
    ทดสอบกับ firefox สามารถแสดงรายการได้ปกติ
    ผมทดสอบกับ ie ที่บ้านทำงานได้ปกติ
    แต่ที่ทำงาน มันแสดงรายการลิสมาให้ แต่ไม่มีตัวอักษร ในรายการ ต้องเอาเมาท์คลิก ถึงจะ return ค่ากลับมาใส่ text box
    ผมต้องแก้ยังไงครับ
    
    
    
    <input name="vesselName" type="text" id="vesselName" size="50" />
    <input name="VesselId" type="hidden" id="VesselId" value="" />
    
    <script type="text/javascript">
    
    function make_autocom(autoObj,showObj){
     var mkAutoObj=autoObj;
     var mkSerValObj=showObj;
     new Autocomplete(mkAutoObj, function() {
      this.setValue = function(id) {  
       document.getElementById(mkSerValObj).value = id;
      }
      if ( this.isModified )
       this.setValue("");
      if ( this.value.length < 1 && this.isNotClick )
       return ; 
     // return "gdata.php?q=" + this.value;
      return "gdata.php?q=" + decodeURIComponent(this.value);
    
        }); 
    } 
    make_autocom("vesselName","VesselId");

    </script>
    
    //-----------------------------------------------------
    gdata.php
    
    <?php
    header("Content-type:text/html; charset=tis-620");    
    // เชื่อมต่อฐานข้อมูล
    $link=mysql_connect("localhost","xxx","yyy") or die("error".mysql_error());
    mysql_select_db("xy",$link);
    mysql_query("SET NAMES TIS620");
    $q = $_GET["q"];
    $pagesize = 50;// จำนวนรายการที่ต้องการแสดง
    $table_db="tblvessel";// ตารางที่ต้องการค้นหา
    $find_field="vesselName";// ฟิลที่ต้องการค้นหา
    echo $sql = "select * from $table_db  where locate('$q', $find_field) > 0 order by locate('$q', $find_field), $find_field limit $pagesize";
    $results = mysql_query($sql);
    while ($row = mysql_fetch_array( $results )) {
     $id = $row["RecId"];// ฟิลที่ต้องการส่
     $name = ucwords( $row["vesselName"] );// ฟิลที่ต้องการแงค่ากลับ
     //$name = ucwords( ( $row["vesselName"] ) ); // ฟิลที่ต้องการแงค่ากลับ
     // ป้องกันเครื่องหมาย '
     $name = str_replace("'", "'", $name);
     // กำหนดตัวหนาให้กับคำที่มีการพิมพ์
     $display_name = preg_replace("/(" . $q . ")/i", "<b></b>", $name);
     
     echo "<li onselect=\"this.setText('$name').setValue('$id');\">$display_name</li>";
    }
    mysql_close();
    ?>
     
9

เข้าใจว่า ที่ทำงาน น่าจะเป็น IE7 มั้ง

ถ้าใช่ ลองเปลี่ยน tag เป็น tag อื่น ที่ไม่ใช่ li เช่น อาจใช้ p สำหรับแต่ละแถว แทน

หรือ ลองดูตามนี้ IE 8 มันมากับเรื่องปวดหัว
10
^