หน้า: 1 2 3 4 5 [6] 7 8 9 10 11 12
 
ผู้เขียน กระจู๋: ภาษา SQL  (อ่าน 35719 ครั้ง)
0 สาวก และ 1 ขาจร กำลังดูกระจู๋นี้
ถามครับ สมมุติมีฐานข้อมูลประชากรที่มีโครงสร้างดังนี้

tbl_country (ตารางประเทศ)
- country_id
- country_name
- country_description

tbl_state(ตารางจังหวัด)
- state_id
- state_name
- state_description
- country_id (มีไว้เพื่อบอกว่าจังหวัดนี้เป็นของประเทศอะไร)

tbl_area(ตารางเขต)
- area_id
- area_name
- area_description
- area_male_population (ตัวเลขจำนวนประชากรชาย)
- area_female_population (ตัวเลขจำนวนประชากรหญิง)
- state_id (มีเพื่อบอกว่าเขตนี้เป็นของจังหวัดอะไร)

สมมุติรับ input จาก form มาเป็นเลข country_id แล้วอยากให้ query ออกมาเป็นจำนวนประชากรทั้งหมดของประเทศที่มี country_id นั้น จะต้องใช้คำสั่ง sql ยังไงเหรอครับ

(อันนี้ใน mySQL นะ)
บันทึกการเข้า

50 levels avaliable, 22 secrets levels avaliable :P
SELECT SUM(area_male_population) + SUM(area_female_population) AS population
FROM tbl_area WHERE state_id IN (
SELECT state_id FROM tbl_state WHERE country_id IN (
SELECT country_id FROM tbl_coutry WHERE country_id = xxx
));


ประมาณนี้ครับ
บันทึกการเข้า

หูย สุดยอดด ขอบคุณ icez มากครับ  ไหว้
บันทึกการเข้า

50 levels avaliable, 22 secrets levels avaliable :P
SELECT SUM(area_male_population) + SUM(area_female_population) AS population
FROM tbl_area WHERE state_id IN (
SELECT state_id FROM tbl_state WHERE country_id IN (
SELECT country_id FROM tbl_coutry WHERE country_id = xxx
));


ประมาณนี้ครับ

แบบนี้เรียกได้เร็วกว่า join ไหม
บันทึกการเข้า
select sum(a.area_male_population) + sum(a.area_female_population)
from tbl_country c,tbl_state s,tbl_area a
where a.state_id = s.state_id
and s.country_id = c.country_id
and c.country_id = xxx

ได้ผลเหมือนกัน
select หลายทีมันช้ากว่ามั๊ย แต่ไม่น่าจะมากเท่าไหร่
บันทึกการเข้า
ยังไงรบกวนช่วยอธิบาย code ของ icez กับ โต ด้วยได้หรือเปล่าครับ
คือความรู้เรื่อง sql ผมมันอ่อนด๋อยมากอ่ะ อยากรู้เรื่องมั่ง
ลองไปหาอ่านในเว็บ mysql.org (ซึ่งอ่านยากพอๆกับ help ของ flash  ฮือๆ~) ก็ยังไม่เข้าใจว่า AS กับ IN() มันทำอะไรได้ แล้ววิธีของโตที่มี a. , s. พวกนี้คืออะไีรเหรอครับ
บันทึกการเข้า

50 levels avaliable, 22 secrets levels avaliable :P

ตัว a s c ของโต ดูที่ตอนเรียก FROM ครับ เหมือนเป็นการสร้างชื่อเพื่อแทนค่าใน table นั้นๆ เพื่อป้องกันการเรียกซ้ำซ้อนครับ

เดี๋ยวขอลองคิดดูแป๊บนึงพึ่งเปิดคอม  เจ๋ง
บันทึกการเข้า

เราจะต้องการอะไรมากมายไปกว่า อะไรมากมาย
a. , s. พวกนี้เนี่ยแทนค่าจากตารางมาเป็นตัวย่อน่ะครับ จะได้อ้างถึงง่ายๆ
ย่อโดยเอาชื่อตารางแล้ววรรค1ทีตามด้วยชื่อที่อยากให้เป็น



select sum(a.area_male_population) + sum(a.area_female_population) เลือกค่าซัมมา+กัน
from tbl_country c,tbl_state s,tbl_area a 
จากตาราง
tbl_country ย่อให้เป็น c
tbl_state ย่อให้เป็น  s
tbl_area ย่อให้เป้น a

where a.state_id = s.state_id
and s.country_id = c.country_id
and c.country_id = xxx

แวร์ที่ state_id ของตาราง tbl_area  ที่เท่ากันกับ state_id ของตาราง tbl_state
และ country_id ของตาราง tbl_state ที่เท่ากันกับcountry_id ของตาราง tbl_country
และ country_id ของตาราง tbl_country มีค่าเท่ากับ ประเทศที่มี country_id นั้น


SELECT SUM(area_male_population) + SUM(area_female_population) AS population
FROM tbl_area WHERE state_id IN (
SELECT state_id FROM tbl_state WHERE country_id IN (
SELECT country_id FROM tbl_coutry WHERE country_id = xxx
));


ประมาณนี้ครับ
ของไอซ์จะ ซีเลคหลายรอบหน่อย เป็นลำดับๆไปน่ะ

FROM tbl_area WHERE
state_id IN
(
    SELECT state_id FROM tbl_state WHERE country_id IN
         (
          SELECT country_id FROM tbl_coutry WHERE country_id = xxx
          )
);
เอา state_id ใน ตาราง  tbl_state ที่มีค่า country_id เท่ากับกับ country_id ใน tbl_coutry ซึ่ง country_id = xxx


เข้าใจแต่อธิบายไม่ถูก  ฮือๆ~
« แก้ไขครั้งสุดท้าย: 12 มี.ค. 2008, 00:40 น. โดย โต » บันทึกการเข้า
เหมือนจะเิริ่มเข้าใจแล้ว
แต่พอเปิด editplus ขึ้นมาจะเขียนเองก็พบว่ายังไม่ค่อยเข้าใจอยู่ดีครับ   กร๊าก ฮือๆ~


 ไหว้
บันทึกการเข้า

50 levels avaliable, 22 secrets levels avaliable :P


 ฮือๆ~ คิดแบบแปลกกว่านี้ไม่ออกแล้วครับ ว่าจะใช้ group by ไม่ก็ inner join แต่มันก็ sum ชาย หญิงไม่ได้

จะลองเขียน sql ให้ลองเขียนที่ mysql เลยครับ ลองใช้ tools ดู เช่น sqlyog
บันทึกการเข้า

เราจะต้องการอะไรมากมายไปกว่า อะไรมากมาย
ไม่ต้องแปลกก็ได้ครับ แค่อธิบายคำว่า group by กับ inner join อะไรนี่ให้ผมฟังก็ได้บุญแล้ว 55
บันทึกการเข้า

50 levels avaliable, 22 secrets levels avaliable :P
http://www.w3schools.com/sql/sql_groupby.asp

http://www.w3schools.com/sql/sql_join.asp

อธิบายไม่ถูกจริงๆ ครับ  ง่ะ
บันทึกการเข้า

เราจะต้องการอะไรมากมายไปกว่า อะไรมากมาย
เพิ่มเติม group by กับ inner join ครับ

group by

inner join
บันทึกการเข้า
ทีแรกผมก็ว่าจะเขียน inner join นั่นแหละครับ
แต่เขียนๆ ไปแล้วมึน เลยใช้ sub query เอาดีกว่า


select sum(a.area_male_population) + sum(a.area_female_population)
from tbl_country c,tbl_state s,tbl_area a
where a.state_id = s.state_id
and s.country_id = c.country_id
and c.country_id = xxx

ได้ผลเหมือนกัน
select หลายทีมันช้ากว่ามั๊ย แต่ไม่น่าจะมากเท่าไหร่
จริงๆ ถ้าทำ index ไว้ (หรือเป็น primary key) จะเร็วมากๆ ครับ
ไม่ว่าแบบไหนก็เหอะ
บันทึกการเข้า

ไม่รู้เรื่อง  หมีโหด~
บันทึกการเข้า

[ FACT HOSTING ] [ บ้านโฮมฮัก ]
Today you , Tomorrow me.
หน้า: 1 2 3 4 5 [6] 7 8 9 10 11 12
 
 
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2006-2007, Simple Machines | Thai language by ThaiSMF Valid XHTML 1.0! Valid CSS!