ThaiSEOBoard.com

พัฒนาเว็บไซต์ => Programming => ข้อความที่เริ่มโดย: itmaiz ที่ 21 พฤษภาคม 2017, 18:27:12



หัวข้อ: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 21 พฤษภาคม 2017, 18:27:12
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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); 


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: p44n ที่ 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);


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: infamous ที่ 21 พฤษภาคม 2017, 20:45:04
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: affsom ที่ 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ออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: rapiz ที่ 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ออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

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

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

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

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: affsom ที่ 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ออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

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

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

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

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

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 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ออกมาได้มากกว่า แต่ต้องดูว่าข้อมูลที่จะใช้จำเป็นหรือป่าวด้วยนะครับ

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 22 พฤษภาคม 2017, 09:07:51
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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
ผมเอามาใส่แล้วแต่ไม่ได้เหมือนเดิมครับ


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: infamous ที่ 22 พฤษภาคม 2017, 14:46:42
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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 ครับ ผมทำเป็นตัวอย่างให้ดูแบบง่ายๆแล้ว


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: haijai.com ที่ 22 พฤษภาคม 2017, 15:13:33
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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:


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 22 พฤษภาคม 2017, 18:28:06
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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:

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 22 พฤษภาคม 2017, 18:31:45
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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

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

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


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: rapiz ที่ 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 ด้วยนะครับ


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: itmaiz ที่ 23 พฤษภาคม 2017, 10:28:21
โค้ดตามนี้ครับ รบกวนช่วยหน่อยครับผมแก้ไม่ตกครับว่าทำไมเวลา Search ข้อมูลตามวันที่ไม่แสดงครับ :-X
โค๊ด:
$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
(https://www.img.in.th/images/5545101a005ab29f59430085f66fffd9.jpg)


หัวข้อ: Re: สอบถามการ JOIN 2 ตารางข้อมูลไม่แสดงครับ
เริ่มหัวข้อโดย: Kanomroo ที่ 23 พฤษภาคม 2017, 14:03:06
มาเก็บความรู้ค่ะ ปกติอยู่แต่ Thaicreate กับ stackoverflow ในไทยเสียวคนเก่งๆเยอะเหมือนกัน

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