ยินดีต้อนรับคุณ, บุคคลทั่วไป กรุณา เข้าสู่ระบบ หรือ ลงทะเบียน

เข้าสู่ระบบด้วยชื่อผู้ใช้ รหัสผ่าน และระยะเวลาในเซสชั่น

ThaiSEOBoard.comพัฒนาเว็บไซต์Programmingสอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
หน้า: [1]   ลงล่าง
พิมพ์
ผู้เขียน หัวข้อ: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ  (อ่าน 1897 ครั้ง)
0 สมาชิก และ 1 บุคคลทั่วไป กำลังดูหัวข้อนี้
itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« เมื่อ: 21 พฤษภาคม 2017, 18:27:12 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 
บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
p44n
Verified Seller
สมุนแก๊งเสียว
*

พลังน้ำใจ: 105
ออฟไลน์ ออฟไลน์

กระทู้: 676



ดูรายละเอียด
« ตอบ #1 เมื่อ: 21 พฤษภาคม 2017, 19:12:11 »

$query = " 
  SELECT
   T1.id
   ,T1.orders_dates
   ,SUM(T2.order_detail_quantity * T2.order_detail_price) total
  FROM
   orders AS T1
  INNER JOIN order_details AS T2 ON T1.id = T2.order_id
  GROUP BY T1.id,T1.orders_dates
  WHERE T1.orders_dates BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
  "; 
$result = mysqli_query($connect, $query);
บันทึกการเข้า

Python, PHP OOP, MVC CodeIgniter, MongoDB, MySQL, MsSQL ,CSS Tableless, Responsive Design, Cross-platform, Javascript, jQuery, AngularJS, NodeJS,  Fackbook API, Paypal API, Omise API, Google Map API, C# Window Applications, .NET Framework, JAVA (Android Developer, JSP), Hybrid Application with Cordova + Ionic Framework, ReactJS, React Native
infamous
ก๊วนเสียว
*

พลังน้ำใจ: 14
ออฟไลน์ ออฟไลน์

กระทู้: 295



ดูรายละเอียด
« ตอบ #2 เมื่อ: 21 พฤษภาคม 2017, 20:45:04 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 

เวลาท่านใช้ AS ... ท่านต้องเอา alias มาใช้กำหนดข้างหน้าในแต่ละ column ของ tb นั้นด้วยนะครับ เช่น blash_tb.blah_column_name หวังว่าคงไม่งงนะครับ

**โปรแกรมมิ่งไม่ใช่แค่ copy&paste
บันทึกการเข้า
affsom
สมุนแก๊งเสียว
*

พลังน้ำใจ: 24
ออฟไลน์ ออฟไลน์

กระทู้: 501



ดูรายละเอียด
« ตอบ #3 เมื่อ: 21 พฤษภาคม 2017, 21:54:32 »

ON ควรอยู่หลังการ JOIN
เมื่อกำหนด AS ควรใส่ alias ที่หน้าColumnที่จะเลือก แตถ้า JOIN แล้วcolumnไม่ซ้ำก็ไม่ต้องใส่ alias

ประมาณนี้
โค๊ด:
$query = "  
          SELECT T1.id, T1.orders_dates, SUM(T2.order_detail_quantity * T2.order_detail_price) total
          FROM orders AS T1
          INNER JOIN order_details AS T2 ON (T1.id = T2.order_id)
          GROUP BY T2.order_id
          WHERE T1.orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."'  
          ";  
      $result = mysqli_query($connect, $query);
ต้องดูด้วยว่า
column => order_detail_quantity กับ
column => order_detail_price

อยู่ที่ตารางใหน
ถ้าอยู่ orders ก็ คือ T1.
ถ้าอยู่ order_details ก็ คือ T2.

แต่จากชื่อที่ตั้งก็น่าจะยุ order_details
หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

 Smiley Smiley ผิดถูกขออภัยมือใหม่เหมือนกัน
« แก้ไขครั้งสุดท้าย: 21 พฤษภาคม 2017, 22:03:25 โดย affsom » บันทึกการเข้า
rapiz
Newbie
*

พลังน้ำใจ: 13
ออฟไลน์ ออฟไลน์

กระทู้: 81



ดูรายละเอียด เว็บไซต์
« ตอบ #4 เมื่อ: 21 พฤษภาคม 2017, 23:19:12 »

ON ควรอยู่หลังการ JOIN
เมื่อกำหนด AS ควรใส่ alias ที่หน้าColumnที่จะเลือก แตถ้า JOIN แล้วcolumnไม่ซ้ำก็ไม่ต้องใส่ alias

ประมาณนี้
โค๊ด:
$query = "  
          SELECT T1.id, T1.orders_dates, SUM(T2.order_detail_quantity * T2.order_detail_price) total
          FROM orders AS T1
          INNER JOIN order_details AS T2 ON (T1.id = T2.order_id)
          GROUP BY T2.order_id
          WHERE T1.orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."'  
          ";  
      $result = mysqli_query($connect, $query);
ต้องดูด้วยว่า
column => order_detail_quantity กับ
column => order_detail_price

อยู่ที่ตารางใหน
ถ้าอยู่ orders ก็ คือ T1.
ถ้าอยู่ order_details ก็ คือ T2.

แต่จากชื่อที่ตั้งก็น่าจะยุ order_details
หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

 Smiley Smiley ผิดถูกขออภัยมือใหม่เหมือนกัน

หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า ดูไม่ค่อย make sense เลยครับ

left join - ดึงตารางซ้ายมาโช หาก a.a ไม่เท่ากับ b.a ก็ยังจะโช data ด้านขวา โดยที่ field ด้านซ้ายจะเป็น NULL
inner join - หาก ตาราง a.a ไม่เท่ากับ b.a ก็ return 0 row ครับ

ควรจะเลือกให้ถูกต้องนะครับ
« แก้ไขครั้งสุดท้าย: 21 พฤษภาคม 2017, 23:24:45 โดย rapiz » บันทึกการเข้า

Web Hosting,Reseller Hosting ราคาถูกเริ่มต้นแค่ 200฿ ต่อปีเท่านั้น!
VPS Linux, Windows (*ฟรี Direct Admin*) เริ่มต้นแค่ 700฿ ต่อเดือนเท่านั้น
รับเขียน Application บน Windows, Linux ด้วยทีมงานมืออาชีพ!!
สนใจ สมัครบริการด้านบน http://www.rapizhost.com
ติดต่อ 091-7733660 (24ชม.) Line ID : @rapizhost
affsom
สมุนแก๊งเสียว
*

พลังน้ำใจ: 24
ออฟไลน์ ออฟไลน์

กระทู้: 501



ดูรายละเอียด
« ตอบ #5 เมื่อ: 21 พฤษภาคม 2017, 23:36:51 »

ON ควรอยู่หลังการ JOIN
เมื่อกำหนด AS ควรใส่ alias ที่หน้าColumnที่จะเลือก แตถ้า JOIN แล้วcolumnไม่ซ้ำก็ไม่ต้องใส่ alias

ประมาณนี้
โค๊ด:
$query = "  
          SELECT T1.id, T1.orders_dates, SUM(T2.order_detail_quantity * T2.order_detail_price) total
          FROM orders AS T1
          INNER JOIN order_details AS T2 ON (T1.id = T2.order_id)
          GROUP BY T2.order_id
          WHERE T1.orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."'  
          ";  
      $result = mysqli_query($connect, $query);
ต้องดูด้วยว่า
column => order_detail_quantity กับ
column => order_detail_price

อยู่ที่ตารางใหน
ถ้าอยู่ orders ก็ คือ T1.
ถ้าอยู่ order_details ก็ คือ T2.

แต่จากชื่อที่ตั้งก็น่าจะยุ order_details
หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

 Smiley Smiley ผิดถูกขออภัยมือใหม่เหมือนกัน

หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า ดูไม่ค่อย make sense เลยครับ

left join - ดึงตารางซ้ายมาโช หาก a.a ไม่เท่ากับ b.a ก็ยังจะโช data ด้านขวา โดยที่ field ด้านซ้ายจะเป็น NULL
inner join - หาก ตาราง a.a ไม่เท่ากับ b.a ก็ return 0 row ครับ

ควรจะเลือกให้ถูกต้องนะครับ

ขอบคุณครับ หัดเหมือนกัน ได้ความรู้มาเพิ่ม คือปกติใช้ LEFT มาตลอด
บันทึกการเข้า
itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« ตอบ #6 เมื่อ: 22 พฤษภาคม 2017, 09:06:46 »

ON ควรอยู่หลังการ JOIN
เมื่อกำหนด AS ควรใส่ alias ที่หน้าColumnที่จะเลือก แตถ้า JOIN แล้วcolumnไม่ซ้ำก็ไม่ต้องใส่ alias

ประมาณนี้
โค๊ด:
$query = "  
          SELECT T1.id, T1.orders_dates, SUM(T2.order_detail_quantity * T2.order_detail_price) total
          FROM orders AS T1
          INNER JOIN order_details AS T2 ON (T1.id = T2.order_id)
          GROUP BY T2.order_id
          WHERE T1.orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."'  
          ";  
      $result = mysqli_query($connect, $query);
ต้องดูด้วยว่า
column => order_detail_quantity กับ
column => order_detail_price

อยู่ที่ตารางใหน
ถ้าอยู่ orders ก็ คือ T1.
ถ้าอยู่ order_details ก็ คือ T2.

แต่จากชื่อที่ตั้งก็น่าจะยุ order_details
หรือลองเปลียนเป็น LEFT JOIN ผมชอบใช้มันดึงcolumnออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

 Smiley Smiley ผิดถูกขออภัยมือใหม่เหมือนกัน
ผมลองทำแล้วครับไม่ได้เหมือนเดิมผม
บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« ตอบ #7 เมื่อ: 22 พฤษภาคม 2017, 09:07:51 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 

เวลาท่านใช้ AS ... ท่านต้องเอา alias มาใช้กำหนดข้างหน้าในแต่ละ column ของ tb นั้นด้วยนะครับ เช่น blash_tb.blah_column_name หวังว่าคงไม่งงนะครับ

**โปรแกรมมิ่งไม่ใช่แค่ copy&paste
ผมเอามาใส่แล้วแต่ไม่ได้เหมือนเดิมครับ
บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
infamous
ก๊วนเสียว
*

พลังน้ำใจ: 14
ออฟไลน์ ออฟไลน์

กระทู้: 295



ดูรายละเอียด
« ตอบ #8 เมื่อ: 22 พฤษภาคม 2017, 14:46:42 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 


เวลาท่านใช้ AS ... ท่านต้องเอา alias มาใช้กำหนดข้างหน้าในแต่ละ column ของ tb นั้นด้วยนะครับ เช่น blash_tb.blah_column_name หวังว่าคงไม่งงนะครับ

**โปรแกรมมิ่งไม่ใช่แค่ copy&paste

ผมเอามาใส่แล้วแต่ไม่ได้เหมือนเดิมครับ


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

ซึ่งคำตอบก็มีท่านอื่นๆ ได้ใบ้ไปหมดแล้ว(สำหรับ mysql basic) อันนี้ต้องงมต่อครับ ไม่ใช่ copy & paste แล้วรัน แล้วผลลัพธ์ยังไม่ได้อีก แล้วมาโพสตามต่อ

นั่นแสดงว่า ท่านไม่ได้หาข้อมูล หรือมีพื้นฐานเกี่ยวกับ mysql หรือเทคนิคการดัดแปลงเลย

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

== เข้าประเด็น ===
โจทย์แบบนี้มันแค่การดึงรายการมาทำ report/summary เท่านั้น ไม่ได้ยากเกินความสามารถท่านหรอกครับ แค่ join 2-3 ตาราง ผมออกมาทำงานจริงๆเคย join 6-7 ตารางแหน่ะครับวิ่งฉิวๆ
mysql มันไม่ได้ฉลาดมาก แต่ก็ไม่โง่จนเกินไป ถ้าอันนี้ไม่ได้ ลองแบบอื่นดูครับ สังเกตุผลลัพธ์ไปเรื่อยๆ แล้วท่านจะจับทางมันได้ โจทย์ไหนๆ ดูแปปเดียวก็ทำได้แล้ว
ฝึกทำบ่อยๆ เดวก็ชิน พยายามหาโจทย์มาลองทำเยอะๆ (ตอนเรียนวิทย์คอมพ์ผมไม่ได้ออกไปไหนเลย)

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

ส่วนด้านล่างนี้ผมลองทำเป็นตัวอย่างให้ดูครับว่า เวลาเราจะดึงข้อมูลที่มีการ join เพื่อทำ report/summary นั้น สามารถทำอย่างไรได้บ้าง

== tables schema for testing ==
โค๊ด:
CREATE TABLE IF NOT EXISTS `oc_order` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` int(11) NOT NULL,
  `date_added` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `oc_order` (`order_id`, `customer_id`, `date_added`, `date_modified`) VALUES (null,9, '2017-05-22 12:11:28', '2017-05-22 12:11:28');
INSERT INTO `oc_order` (`order_id`, `customer_id`, `date_added`, `date_modified`) VALUES (null,12, '2017-05-25 14:20:48', '2017-05-25 14:20:48');

CREATE TABLE IF NOT EXISTS `oc_order_detail` (
  `order_detail_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(128) NOT NULL,
  `quantity` int(11) NOT NULL,
  `unit_price` decimal(15,4) NOT NULL DEFAULT '0.0000',
  `date_added` datetime NOT NULL,
  PRIMARY KEY (`order_detail_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,1,77,'Samsung Galaxy Tab10.2', 2, '120.0000', '2017-05-22 12:11:28');
INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,1,88,'Galaxy Note 7', 3, '220.0000', '2017-05-22 14:20:48');

INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,2,34,'Acer Notebook 001', 1, '1800.0000', '2017-05-25 12:11:28');
INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,2,45,'HP Notebook 002', 1, '2900.0000', '2017-05-25 14:20:48');


ส่วนด้านล่างจะเป็นตัวอย่างคำสั่ง query ครับ (nested query)
โค๊ด:
select order_id,sum(quantity) as qty,sum(sub_total) as total from
(
select o.order_id,o.date_added,od.product_id,od.quantity,od.unit_price,(od.quantity*od.unit_price) as sub_total   
from oc_order as o
left join oc_order_detail as od on (od.order_id=o.order_id)
where o.date_added between '2017-05-20 00:00:00' and '2017-05-30 00:00:00'
) out_t group by order_id

ถ้าท่านยังมองภาพไม่ออกไปลิงค์ http://sqlfiddle.com/#!9/f19db1/11 ครับ ผมทำเป็นตัวอย่างให้ดูแบบง่ายๆแล้ว
บันทึกการเข้า
haijai.com
คนรักเสียว
*

พลังน้ำใจ: 5
ออฟไลน์ ออฟไลน์

กระทู้: 121



ดูรายละเอียด เว็บไซต์
« ตอบ #9 เมื่อ: 22 พฤษภาคม 2017, 15:13:33 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 

เอา Database ของ  orders  กับ order_details  มาดูโหน่ยสิครับ ถ้าดูโค้ดลอยๆ ถ้าอักษรผิดตัวเดียวมันก้อเปิดไม่ได้อยู่แล้ว  wanwan012
บันทึกการเข้า

itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« ตอบ #10 เมื่อ: 22 พฤษภาคม 2017, 18:28:06 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 

เอา Database ของ  orders  กับ order_details  มาดูโหน่ยสิครับ ถ้าดูโค้ดลอยๆ ถ้าอักษรผิดตัวเดียวมันก้อเปิดไม่ได้อยู่แล้ว  wanwan012

พรุ่งนี้ผมจะแคปหน้าจอให้ครับผม
บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« ตอบ #11 เมื่อ: 22 พฤษภาคม 2017, 18:31:45 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 


เวลาท่านใช้ AS ... ท่านต้องเอา alias มาใช้กำหนดข้างหน้าในแต่ละ column ของ tb นั้นด้วยนะครับ เช่น blash_tb.blah_column_name หวังว่าคงไม่งงนะครับ

**โปรแกรมมิ่งไม่ใช่แค่ copy&paste

ผมเอามาใส่แล้วแต่ไม่ได้เหมือนเดิมครับ


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

ซึ่งคำตอบก็มีท่านอื่นๆ ได้ใบ้ไปหมดแล้ว(สำหรับ mysql basic) อันนี้ต้องงมต่อครับ ไม่ใช่ copy & paste แล้วรัน แล้วผลลัพธ์ยังไม่ได้อีก แล้วมาโพสตามต่อ

นั่นแสดงว่า ท่านไม่ได้หาข้อมูล หรือมีพื้นฐานเกี่ยวกับ mysql หรือเทคนิคการดัดแปลงเลย

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

== เข้าประเด็น ===
โจทย์แบบนี้มันแค่การดึงรายการมาทำ report/summary เท่านั้น ไม่ได้ยากเกินความสามารถท่านหรอกครับ แค่ join 2-3 ตาราง ผมออกมาทำงานจริงๆเคย join 6-7 ตารางแหน่ะครับวิ่งฉิวๆ
mysql มันไม่ได้ฉลาดมาก แต่ก็ไม่โง่จนเกินไป ถ้าอันนี้ไม่ได้ ลองแบบอื่นดูครับ สังเกตุผลลัพธ์ไปเรื่อยๆ แล้วท่านจะจับทางมันได้ โจทย์ไหนๆ ดูแปปเดียวก็ทำได้แล้ว
ฝึกทำบ่อยๆ เดวก็ชิน พยายามหาโจทย์มาลองทำเยอะๆ (ตอนเรียนวิทย์คอมพ์ผมไม่ได้ออกไปไหนเลย)

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

ส่วนด้านล่างนี้ผมลองทำเป็นตัวอย่างให้ดูครับว่า เวลาเราจะดึงข้อมูลที่มีการ join เพื่อทำ report/summary นั้น สามารถทำอย่างไรได้บ้าง

== tables schema for testing ==
โค๊ด:
CREATE TABLE IF NOT EXISTS `oc_order` (
  `order_id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` int(11) NOT NULL,
  `date_added` datetime NOT NULL,
  `date_modified` datetime NOT NULL,
  PRIMARY KEY (`order_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `oc_order` (`order_id`, `customer_id`, `date_added`, `date_modified`) VALUES (null,9, '2017-05-22 12:11:28', '2017-05-22 12:11:28');
INSERT INTO `oc_order` (`order_id`, `customer_id`, `date_added`, `date_modified`) VALUES (null,12, '2017-05-25 14:20:48', '2017-05-25 14:20:48');

CREATE TABLE IF NOT EXISTS `oc_order_detail` (
  `order_detail_id` int(11) NOT NULL AUTO_INCREMENT,
  `order_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `product_name` varchar(128) NOT NULL,
  `quantity` int(11) NOT NULL,
  `unit_price` decimal(15,4) NOT NULL DEFAULT '0.0000',
  `date_added` datetime NOT NULL,
  PRIMARY KEY (`order_detail_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,1,77,'Samsung Galaxy Tab10.2', 2, '120.0000', '2017-05-22 12:11:28');
INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,1,88,'Galaxy Note 7', 3, '220.0000', '2017-05-22 14:20:48');

INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,2,34,'Acer Notebook 001', 1, '1800.0000', '2017-05-25 12:11:28');
INSERT INTO `oc_order_detail` (`order_detail_id`, `order_id`, `product_id`, `product_name`, `quantity`,`unit_price`,`date_added`) VALUES (null,2,45,'HP Notebook 002', 1, '2900.0000', '2017-05-25 14:20:48');


ส่วนด้านล่างจะเป็นตัวอย่างคำสั่ง query ครับ (nested query)
โค๊ด:
select order_id,sum(quantity) as qty,sum(sub_total) as total from
(
select o.order_id,o.date_added,od.product_id,od.quantity,od.unit_price,(od.quantity*od.unit_price) as sub_total   
from oc_order as o
left join oc_order_detail as od on (od.order_id=o.order_id)
where o.date_added between '2017-05-20 00:00:00' and '2017-05-30 00:00:00'
) out_t group by order_id

ถ้าท่านยังมองภาพไม่ออกไปลิงค์ http://sqlfiddle.com/#!9/f19db1/11 ครับ ผมทำเป็นตัวอย่างให้ดูแบบง่ายๆแล้ว

ขอบคุณครับผม จะเอาไปศึกษาข้อมูลต่อเพราะผมหาจากเว็บฝรั่งมาเจอการ JOIN แบบนี้แล้วเอามาปรับแล้วยัง ERROR ก็เลยเอามาถามครับ
บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
rapiz
Newbie
*

พลังน้ำใจ: 13
ออฟไลน์ ออฟไลน์

กระทู้: 81



ดูรายละเอียด เว็บไซต์
« ตอบ #12 เมื่อ: 22 พฤษภาคม 2017, 23:54:30 »

โค๊ด:
	SELECT
A.id,
A.orders_dates,
SUM((ตาราง A หรือ B).order_detail_quantity * (ตาราง A หรือ B)order_detail_price) AS total
FROM orders A
INNER JOIN order_details B
ON B.order_id = A.id
GROUP BY B.order_id
WHERE (ตาราง A หรือ B).orders_dates BETWEEN 'X' AND 'Y'

ปล1. หากมี data มากๆ ควรทำ index ไว้ที่ orders_dates ด้วยนะครับ (ซึ่งคาดว่า B.order_id กับ A.id จะเป็น primary key อยู่แล้ว)
ปล2. ควรจะดู format datetime ที่ส่งไป query ด้วยนะครับ
« แก้ไขครั้งสุดท้าย: 22 พฤษภาคม 2017, 23:58:26 โดย rapiz » บันทึกการเข้า

Web Hosting,Reseller Hosting ราคาถูกเริ่มต้นแค่ 200฿ ต่อปีเท่านั้น!
VPS Linux, Windows (*ฟรี Direct Admin*) เริ่มต้นแค่ 700฿ ต่อเดือนเท่านั้น
รับเขียน Application บน Windows, Linux ด้วยทีมงานมืออาชีพ!!
สนใจ สมัครบริการด้านบน http://www.rapizhost.com
ติดต่อ 091-7733660 (24ชม.) Line ID : @rapizhost
itmaiz
คนรักเสียว
*

พลังน้ำใจ: 7
ออฟไลน์ ออฟไลน์

กระทู้: 152



ดูรายละเอียด เว็บไซต์
« ตอบ #13 เมื่อ: 23 พฤษภาคม 2017, 10:28:21 »

โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ Lips Sealed
โค๊ด:
$query = "  
          SELECT
            T1.id,T1.orders_dates
          FROM
            orders AS T1
          INNER JOIN order_details AS T2
            SUM(order_detail_quantity * order_detail_price) total
          ON
            T1.id = T2.order_id
          GROUP BY
            order_id
          WHERE
            orders_dates
          BETWEEN '".$_POST["from_date"]."' AND '".$_POST["to_date"]."' 
          "; 
      $result = mysqli_query($connect, $query); 

เอา Database ของ  orders  กับ order_details  มาดูโหน่ยสิครับ ถ้าดูโค้ดลอยๆ ถ้าอักษรผิดตัวเดียวมันก้อเปิดไม่ได้อยู่แล้ว  wanwan012
Database
« แก้ไขครั้งสุดท้าย: 23 พฤษภาคม 2017, 10:31:54 โดย itmaiz » บันทึกการเข้า

-รับแปลเอกสารภาษาเขมร-ไทย ทุกประเภท
Kanomroo
คนรักเสียว
*

พลังน้ำใจ: 5
ออฟไลน์ ออฟไลน์

กระทู้: 162



ดูรายละเอียด
« ตอบ #14 เมื่อ: 23 พฤษภาคม 2017, 14:03:06 »

มาเก็บความรู้ค่ะ ปกติอยู่แต่ Thaicreate กับ stackoverflow ในไทยเสียวคนเก่งๆเยอะเหมือนกัน

ไม่รู้จะแนะนำอะไร แต่เรื่องวันที่สิ่งสำคัญที่สุด คือ Format ค่ะ

บันทึกการเข้า

ในที่สุด !! เราก็ได้เป็นสมาชิกแล้ว รอนานมากๆๆ
หน้า: [1]   ขึ้นบน
พิมพ์