ภาษา SQL

เริ่มโพสต์โดย เทอร์โบบูสเตอร์, 05 ก.ค. 2006, 14:53 น.

0 สมาชิก และ 1 บุคคลทั่วไป กำลังเปิดอ่านโพสต์นี้

i-poon

ถามครับ สมมุติมีฐานข้อมูลประชากรที่มีโครงสร้างดังนี้

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

icez

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
));


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

i-poon

หูย สุดยอดด ขอบคุณ icez มากครับ  :46:
50 levels avaliable, 22 secrets levels avaliable :P

X11

อ้างคำพูดจาก: icez เมื่อ 11 มี.ค. 2008, 20:27 น.
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 หลายทีมันช้ากว่ามั๊ย แต่ไม่น่าจะมากเท่าไหร่

i-poon

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

ยุนเอ


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

เดี๋ยวขอลองคิดดูแป๊บนึงพึ่งเปิดคอม  :12:
เราจะต้องการอะไรมากมายไปกว่า อะไรมากมาย

โต

#82
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 นั้น


อ้างคำพูดจาก: icez เมื่อ 11 มี.ค. 2008, 20:27 น.
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


เข้าใจแต่อธิบายไม่ถูก  :05:

i-poon

เหมือนจะเิริ่มเข้าใจแล้ว
แต่พอเปิด editplus ขึ้นมาจะเขียนเองก็พบว่ายังไม่ค่อยเข้าใจอยู่ดีครับ   :30: :05:


:46:
50 levels avaliable, 22 secrets levels avaliable :P

ยุนเอ



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

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

i-poon

ไม่ต้องแปลกก็ได้ครับ แค่อธิบายคำว่า group by กับ inner join อะไรนี่ให้ผมฟังก็ได้บุญแล้ว 55
50 levels avaliable, 22 secrets levels avaliable :P

ยุนเอ

เราจะต้องการอะไรมากมายไปกว่า อะไรมากมาย

ต้น

เพิ่มเติม group by กับ inner join ครับ

group by

inner join

icez

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


อ้างคำพูดจาก: โต เมื่อ 11 มี.ค. 2008, 23:39 น.
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) จะเร็วมากๆ ครับ
ไม่ว่าแบบไหนก็เหอะ

นายโอ้เอ้

ไม่รู้เรื่อง  :37:
Today you , Tomorrow me.

SMF 2.1.7 © 2026, Simple Machines