LevelUp! Studio » query https://blog.levelup.in.th Experience the new world. Fri, 26 May 2017 10:06:07 +0000 th hourly 1 http://wordpress.org/?v=3.8.1 MongoDB Cheat list และขั้นตอนการทำ Replication https://blog.levelup.in.th/2013/02/28/mongodb-cheat-list-and-replication-stepmongodb-cheat-list-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%82%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%97%e0%b8%b3-replic/ https://blog.levelup.in.th/2013/02/28/mongodb-cheat-list-and-replication-stepmongodb-cheat-list-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%82%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%97%e0%b8%b3-replic/#comments Thu, 28 Feb 2013 14:14:23 +0000 http://blog.levelup.in.th/?p=2422 สรุปคำสั่ง mongoDB ที่ใช้บ่อยๆ

  • use db1 – ใช้งาน database db1 หรือสร้าง database ใหม่
  • show dbs – แสดงรายชื่อ database ทั้งหมด
  • db.getCollectionNames() – แสดง collection (ตาราง) ทั้งหมด
  • db.createCollection(“users”) – สร้าง collection ชื่อ users
  • db.users.drop() – ลบ collection users
  • db.createCollection(“new”, {capped:true, size:1073741824}); – สร้าง capped collection ขนาด 1073741824 bytes
  • db.logMoney.find({time:{$gte: new Date(2013,2,5)}}); – query date มากกว่าเท่ากับวันที่ๆ กำหนด
  • db.logMoney.ensureIndex({‘time’:1},{background:true}) – new index field time โดย background ไว้สั่งให้ทำโดยไม่ lock collection
  • db.logMoney.getIndexes()  - ดู Index ทั้งหมดขณะนั้น
  • db.logMoney.find({time:{$gt:new Date()}}) – query ระบุเวลา สามารถใช้ร่วมกับ mongodump ได้
  • db.logMoney.aggregate({$match:{time:{$gt:new Date(2013,1,1)},chng:{$lt:0}}},{$group:{_id:{usrId:1, }, count:{$sum:1}, sumAll:{$sum:”$chng”}}}) – ตัวอย่างการใช้งาน query ลักษณะเดียวกับ GROUP BY ใน MySQL
    (SELECT *, COUNT(*) as count,  SUM(chng) as sumAll FROM logMoney WHERE time > “2013-01-01″ AND chng < 0  GROUP BY usrId)

วิธีทำ Replication

ก่อนอื่น MongoDB แนะนำว่าควรมีเครื่องในวงอย่างน้อย 3 เครื่องครับ (แต่เราอาจจะใช้ 2 เครื่อง แล้วใช้อีกเครื่องเป็น Arbiter หรือตัวหลอกแทนได้) ขั้นตอนมีดังนี้

  1. Edit /etc/mongodb.conf ด้วยโปรแกรมที่ถนัด
  2. กำหนด replSet = <ชื่อกลุ่มที่ต้องการ> ในที่นี้ผมตั้งว่า rs0
  3. restart mongodb
  4. ทำข้อ 1-3 ใหม่กับเครื่องที่จะเป็น Slave ทุกเครื่อง
  5. เข้าเครื่องที่จะให้เป็น Master (สมมติว่า ip ภายในของเครื่อง master คือ 10.0.0.1) แล้วพิมพ์ mongo 10.0.0.1 (สำคัญมาก ห้ามลืมพิมพ์ ip หรือพิมพ์ผิดเด็ดขาด ไม่อย่างนั้นจะใช้ไม่ได้)
  6. ถ้าหน้าจอปรากฏดังนี้แสดงว่าทำได้ถูกต้อง

    mongo 10.0.0.1
    MongoDB shell version: 2.2.2
    connecting to: 10.0.0.1/test
    rs0:PRIMARY>
  7. สั่ง rs.initiate()
  8. สั่ง rs.add(“10.0.0.2″) (สมมติเครื่อง slave ip 10.0.0.2) และเครื่อง slave เครื่องอื่นๆ
  9. เสร็จ!

สรุปคำสั่ง replication ที่ใช้บ่อย

  • rs.initiate() – เริ่ม replica set
  • rs.status() – status replica set
  • rs.add(“ip”) – เพิ่ม secondary node
  • rs.addArb(“ip”) – เพิ่ม secondary node แบบตัวหลอกเพื่อโหวตตอน fail-over เท่านั้น ไม่มีข้อมูลจริง
  • rs.stepDown() – ถอนตัวจากการเป็น master
  • db.printReplicationInfo() – เช็คว่า oplog มีอายุกี่วัน

วิธี Backup MongoDB

เทียบเท่า mysqldump นั่นเอง ตัวอย่างนั้นใช้ dump เฉพาะตารางที่กำหนด และ query ในช่วงเวลาที่กำหนด ดังนี้

mongodump –host –port –db <ชื่อ database> –collection <ชื่อ collection> -q ‘{“time”:{“$gte”:{“$date”:1360627200000}}}’

วิธี Restore MongoDB

mongorestore

ขอให้สนุกกับ MongoDB :D

]]>
https://blog.levelup.in.th/2013/02/28/mongodb-cheat-list-and-replication-stepmongodb-cheat-list-%e0%b9%81%e0%b8%a5%e0%b8%b0%e0%b8%82%e0%b8%b1%e0%b9%89%e0%b8%99%e0%b8%95%e0%b8%ad%e0%b8%99%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%97%e0%b8%b3-replic/feed/ 0
Facebook Query Language (FQL) https://blog.levelup.in.th/2012/05/31/facebook-query-language-fql/ https://blog.levelup.in.th/2012/05/31/facebook-query-language-fql/#comments Thu, 31 May 2012 07:05:55 +0000 http://blog.levelup.in.th/?p=1821 Facebook Query Language หรือ FQL เป็นภาษา query ที่ใช้ในการคัดกรองข้อมูลหรือดึงข้อมูลที่เราต้องการจาก Facebook โดยตรง ซึ่งการเขียนจะมีลักษณะคล้ายกับภาษา SQL นั่นคือมีรูปแบบเป็น

SELECT (field) FROM (table) WHERE (condition)

และเราสามารถใช้ operator AND, OR, NOT ได้อีกด้วย แต่สิ่งที่ FQL แตกต่างจาก SQL ก็คือ FQL จะไม่อนุญาตให้เราทำการ join table กันได้ ซึ่งถ้าเราต้องการจะใช้ข้อมูลที่มากกว่า 1 ตาราง เราจะใช้ IN เพื่อทำการเชื่อมข้อมูลระหว่างตาราง และ ระหว่าง 2 ตารางที่จะเชื่อมข้อมูลกัน จะต้องมี field ที่เก็บข้อมูลเหมือนกันอยู่ ซึ่งจะเรียก field นี้ว่าเป็น indexable

หลายคนที่อาจจะใช้ Graph API อาจจะสงสัยว่าในเมื่อเรามี Graph API อยู่แล้ว ซึ่งก็สามารถใช้ในการดึงข้อมูลมาใช้ได้เหมือนกัน แล้วทำไมต้องใช้ FQL อีก นั้นก็เป็นเพราะว่า Graph API ไม่สามารถที่จะดึงข้อมูลเป็นชุดๆได้ เช่นหากเราต้องข้อมูลเป็น username, user_id, gender และ birthday ของเพื่อน ถ้าเราใช้ Graph API เราจำเป็นต้องได้รายชื่อเพื่อนทั้งหมดของเรามาก่อน หลังจากนั้นก็จะได้ user_id กับ username มา แล้วจึงใช้ข้อมูลที่ได้มาไปหาข้อมูล gender และ birthday ของเพื่อนอีกที ซึ่งจะเห็นว่าต้องทำหลายขั้นตอนมาก แต่ถ้าเราใช้ FQL สามารถทำได้โดยเขียนภาษา query ตามนี้

SELECT username, uid, sex, birthday FROM user WHERE uid IN (SELECT uid2 FROM friend WHERE uid1 = me())

มาถึงตรงจุดนี้ อาจมีหลายคนสงสัยว่า แล้วเราจะรู้ได้อย่างไรว่าฐานข้อมูลมีตารางอะไรบ้าง และแต่ละตารางมี field อะไรให้ใช้บ้าง เราสามารถเข้าไปดูได้อ่าน Document และ Reference ได้ที่ https://developers.facebook.com/docs/reference/fql/ ซึ่งลิ้งค์นี้จะบอกข้อมูลเกี่ยวกับตารางและ field เอาไว้ชัดเจน ว่าทาง facebook อนุญาตให้เราสามารถใช้ข้อมูลส่วนไหนได้บ้าง และทาง Facebook ยังมี tool ที่เอาไว้ให้เราใช้ทดสอบ query ที่เราเขียนขึ้นมาได้อีกด้วย ผ่านทาง Graph API Explorer https://developers.facebook.com/tools/explorer?method=GET&path=100001055377057 ซึ่งเมื่อกดลิ้งค์เข้ามาแล้วจะเจอเพจหน้าตาแบบนี้ครับ

fql_tutorial2

หลังจากนั้นตรงที่เป็นลิ้งค์ https://graph.facebook.com/ ให้พิมพ์เพิ่มหลังเครื่องหมาย “/” ไปว่า “fql?q=” แล้วตามด้วย query ที่เราเขียนขึ้นมา
แล้วกด submit เราก็จะได้ผลลัพธ์จากการ query แสดงผลที่ด้านล่างนั้นเอง ทั้งนี้ทั้งนั้น การที่เราจะดึงข้อมูลต่างๆจากตารางมาได้ เราจำเป็นต้องทำการขอ Permissions ต่างๆด้วย ซึ่งข้อมูลในแต่ละ Field จะมีการระบุเอาไว้อยู่แล้วว่าต้องมีการใช้ Permissions ใดบ้าง ดังนั้น ถ้าคิดว่าเขียน query ได้ถูกต้องแน่นอนแล้ว แต่ว่าผลลัพธ์ไม่ขึ้น ให้ลองตรวจสอบดูดีๆนะครับ ว่าได้ทำการขอ permissions ไปหรือเปล่า

หมดเพียงเท่านี้แล้วครับ เรื่องของ Facebook Query Language สำหรับคนที่เคยเขียน SQL มาแล้ว น่าจะฝึกฝนได้ไม่ยากนะครับ ส่วนคนที่ไม่เคยเขียน SQL มาก่อนก็ไม่ต้องน้อยใจไปครับ ของแบบนี้ต้องค่อยๆศึกษาไปเรื่อยๆ เดี๋ยวเราก็เขียนได้ครับ ^^

]]>
https://blog.levelup.in.th/2012/05/31/facebook-query-language-fql/feed/ 0
Update ค่าหลายๆแถว ที่มีค่าต่างๆกัน พร้อมๆกัน ใน MYSQL https://blog.levelup.in.th/2010/05/27/update-%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%ab%e0%b8%a5%e0%b8%b2%e0%b8%a2%e0%b9%86%e0%b9%81%e0%b8%96%e0%b8%a7-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%a1%e0%b8%b5%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%95%e0%b9%88/ https://blog.levelup.in.th/2010/05/27/update-%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%ab%e0%b8%a5%e0%b8%b2%e0%b8%a2%e0%b9%86%e0%b9%81%e0%b8%96%e0%b8%a7-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%a1%e0%b8%b5%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%95%e0%b9%88/#comments Thu, 27 May 2010 10:22:00 +0000 http://blog.levelup.in.th/?p=606 ปัญหา

ต้องการอัพเดต หลายๆแถวใน database ที่แต่ละแถวมีค่าต่างๆกันไป โดยใช้ Query เดียว

เพราะถ้าหากใช้แบบปกติ จะกินทรัพยากรสูงมากต่อการ update 1 ครั้ง

วิธีการ

สมมุติเราต้องการ update ค่า ( id => value) (1 => 3,2 => 4,3 => 5)  ลงใน table

ปกติเราจะต้องใช้ 3 query คือ


UPDATE mytable SET value = 3 WHERE id =1;

UPDATE mytable SET value = 4 WHERE id =2;

UPDATE mytable SET value = 5 WHERE id =3;

แต่หากใช้ CASE มาช่วยในการเขียน query Update จะออกมาเป็นแบบนี้

UPDATE mytable
SET value= CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END
WHERE id IN (1,2,3)

ซึ่งใช้เพียง 1 query เท่านั้น !

ถ้าหากต้องการ update หลายๆ field พร้อมกัน ก็สามารถทำได้โดย

UPDATE mytable
SET value1= CASE id
WHEN 1 THEN 3
WHEN 2 THEN 4
WHEN 3 THEN 5
END,
SET value2= CASE id
WHEN 1 THEN 7
WHEN 2 THEN 8
WHEN 3 THEN 9
END,
WHERE id IN (1,2,3)

Code ตัวอย่าง Php ดูได้จาก source

source :  http://www.karlrixon.co.uk/articles/sql/update-multiple-rows-with-different-values-and-a-single-sql-query/

]]>
https://blog.levelup.in.th/2010/05/27/update-%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%ab%e0%b8%a5%e0%b8%b2%e0%b8%a2%e0%b9%86%e0%b9%81%e0%b8%96%e0%b8%a7-%e0%b8%97%e0%b8%b5%e0%b9%88%e0%b8%a1%e0%b8%b5%e0%b8%84%e0%b9%88%e0%b8%b2%e0%b8%95%e0%b9%88/feed/ 1
Flow control (IF/CASE) ใน Mysql https://blog.levelup.in.th/2009/11/30/flow-control-ifcase-in-mysql-flow-control-ifcase-%e0%b9%83%e0%b8%99-mysql/ https://blog.levelup.in.th/2009/11/30/flow-control-ifcase-in-mysql-flow-control-ifcase-%e0%b9%83%e0%b8%99-mysql/#comments Mon, 30 Nov 2009 07:19:21 +0000 http://blog.levelup.in.th/?p=192 Flow control ใน Mysql

อ้างอิงจาก http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html

คืออะไร? ทำไมต้องใช้?

บางครั้งแม้มันจะง่ายและเร็วกว่า ที่จะทำส่วนคำนวณใน Php ก่อนแล้วค่อยมาทำ Query ใน Mysql แต่ในบางกรณีเล็กๆน้อย หรือบางครั้งที่ต้องการการ Customize โดยไม่ต้องเขียนโค้ดเพิ่ม การเขียน IF/Case เข้าไปใน Mysql ก็สร้างความสะดวกได้มาก


IF(expr1,expr2,expr3)

If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2; otherwise it returns expr3. IF() returns a numeric or string value, depending on the context in which it is used.

mysql> SELECT IF(1>2,2,3); -> 3

mysql> SELECT IF(1<2,’yes’,'no’); -> ‘yes’

mysql> SELECT IF(STRCMP(‘test’,'test1′),’no’,'yes’); -> ‘no’

เป็น IF แบบอย่างง่าย โดยจะมี 3 parameter คือ

- expr1 = Condition โดยให้ใส่เป็นเงื่อนไขต่างๆเช่น a>1 , b < a หรืออื่นๆ ที่ return ค่าเป็น boolean (true/false)

- expr2 = จะทำงานเป็น Condition เป็น true โดย Function IF จะ return ค่า expr2 กลับมา

- expr3 = จะทำงานเป็น Condition เป็น false โดย Function IF จะ return ค่า expr3 กลับมา

โดย IF แบบนี้ จะใช้งานเหมือนกับ Function ทั่วไปเลย ซึ่งข้อเสียคือทำให้ทำ Nested If (If หลายๆเงื่อนไข) ค่อนข้างลำบาก


CASE

CASE value WHEN [compare_value] THEN result [WHEN [compare_value] THEN result …] [ELSEresult] END

CASE WHEN [condition] THEN result [WHEN [condition] THEN result …] [ELSE result] END

mysql> SELECT CASE 1 WHEN 1 THEN ‘one’

->     WHEN 2 THEN ‘two’ ELSE ‘more’ END;

-> ‘one’

mysql> SELECT CASE WHEN 1>0 THEN ‘true’ ELSE ‘false’ END;

-> ‘true’

mysql> SELECT CASE BINARY ‘B’

->     WHEN ‘a’ THEN 1 WHEN ‘b’ THEN 2 END;

-> NULL

Case ของ Mysql จะต่างกับ IF ตรงที่ดูเป็นโครงสร้างภาษา ไม่ใช่เป็ฯ Function

โดยรูปแบบจะเหมือนกับ Switch/Select ของภาษาอื่น คือ จะเข้า Case เมื่อ value/condition มีค่าเท่ากับ compare_value

Trick สำหรับการทำ IF เงื่อนไขแบบเป็นช่วง สามารถดัดแปลงใช้ CASE ช่วยได้

Ex.

(CASE TRUE WHEN point_all<20 THEN 1 WHEN point_all<100 THEN 2 WHEN point_all<500 THEN 3 WHEN point_all<5000 THEN 4 ELSE 5 END) as point_all_lv,

โดยหลักการก็ง่ายๆ ให้ Value ตั้งต้นเป็น TRUE และ ใน WHEN ก็ใส่เป็น Condition ไปแทน ทีนี้เราก็ได้ IF ที่น่าตาอ่านง่ายกว่าแบบ Function หล่ะ

]]>
https://blog.levelup.in.th/2009/11/30/flow-control-ifcase-in-mysql-flow-control-ifcase-%e0%b9%83%e0%b8%99-mysql/feed/ 0
SQL – Query เพื่อทำการจัด Rank ของข้อมูล https://blog.levelup.in.th/2009/07/20/sql-ranksql-query-%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%97%e0%b8%b3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%88%e0%b8%b1%e0%b8%94-rank-%e0%b8%82%e0%b8%ad%e0%b8%87%e0%b8%82%e0%b9%89%e0%b8%ad/ https://blog.levelup.in.th/2009/07/20/sql-ranksql-query-%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%97%e0%b8%b3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%88%e0%b8%b1%e0%b8%94-rank-%e0%b8%82%e0%b8%ad%e0%b8%87%e0%b8%82%e0%b9%89%e0%b8%ad/#comments Mon, 20 Jul 2009 13:33:28 +0000 http://blog.levelup.in.th/?p=86 จาก http://www.1keydata.com/sql/sql-rank.html

Table Total_Sales

Name Sales
John 10
Jennifer 15
Stella 20
Sophia 40
Greg 50
Jeff 20

Query
SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales <= a2.Sales or (a1.Sales=a2.Sales and a1.Name = a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name DESC;

Result:

Name Sales Sales_Rank
Greg 50 1
Sophia 40 2
Stella 20 3
Jeff 20 3
Jennifer 15 5
John 10 6

ถ้าอยากให้เรียงลำดับโดยไม่มีข้ามให้แก้เป็น

Query
SELECT a1.Name, a1.Sales, COUNT(a2.sales) Sales_Rank
FROM Total_Sales a1, Total_Sales a2
WHERE a1.Sales < a2.Sales or (a1.Sales=a2.Sales and a1.Name >= a2.Name)
GROUP BY a1.Name, a1.Sales
ORDER BY a1.Sales DESC, a1.Name ASC;

]]>
https://blog.levelup.in.th/2009/07/20/sql-ranksql-query-%e0%b9%80%e0%b8%9e%e0%b8%b7%e0%b9%88%e0%b8%ad%e0%b8%97%e0%b8%b3%e0%b8%81%e0%b8%b2%e0%b8%a3%e0%b8%88%e0%b8%b1%e0%b8%94-rank-%e0%b8%82%e0%b8%ad%e0%b8%87%e0%b8%82%e0%b9%89%e0%b8%ad/feed/ 0