อยากสอบถาม เทคนิกการ join ตารางครับ กรณีบางตาราง ไม่มีข้อมูล
OR หรือ IN ครับ
Code (SQL)
select
count(*)
from
provinces pv, amphurs ap, tambons tm
where
ap.province_code = pv.code and
(tm.amphur_code = ap.code OR tm.amphur_code = '')
Code (SQL)
select
count(*)
from
provinces pv, amphurs ap, tambons tm
where
ap.province_code = pv.code and
tm.amphur_code IN ('', ap.code)
Date :
2014-11-21 15:48:24
By :
phpinfo()
เอ รู้สึกว่าจะไม่ได้ครับ เอาใหม่ๆ ต้องถามก่อนว่าจะนับอะไรครับ จำนวนจังหวัดหรืออะไร
Date :
2014-11-21 15:53:07
By :
phpinfo()
เอาจำนวน จังหวัดครับ อย่างกรณีแรก query ได้ 77 จังหวัดปกติ แม้บางจังหวัดไม่มีข้อมูล อำเภอหรือ ตำบล
แต่ รูปแบบที่ 2 นิ ออกมาไม่ครบ เคสไหน ไม่มีอำเภอหรือตำบล มา join นิ ไม่ออกเลย
อยากให้รูปแบบที่สอง มีข้อมูลเท่ากับ แบบ แรกครับ
สาเหตุเนื่องจาก เท่าที่ทดสอบ แบบสองจะคิวรี่ได้ไวกว่า กรณีข้อมุลหลายๆพัน record
Date :
2014-11-21 16:53:05
By :
progamer2000
ทำไมไม่ query ตารางจังหวัดอย่างเดียวไปเลยล่ะครับ
Code (SQL)
select count(*) from provinces
Date :
2014-11-21 16:56:31
By :
phpinfo()
จริงๆ ไม่ได้ count คับแต่ เอาข้อมูลมาแสดง อ่า - -"
ข้อมุลมันจริงมัน ไม่ใช่จังหวัดอะครับ เป็นสินค้า join กัน 5 ตาราง
ตารางที่ 5 เป็น tag ของสินค้า บางสินค้าที่ไม่มี tag มันไม่ขึ้นเลย
แบบกรณีใช้แบบ 1 ก็ ขึ้นปกติ แต่ query ช้าครับ ตอนนี้ข้อมุลน้อยก็ยังไม่มีอะไรมาก ถ้าสินค้ามีเยอะ ก็เกรงจะมีปัญหา
แบบกรณีใช้แบบ 2 สินค้าที่ไม่มี tag ไม่ขึ้น T_T
ประวัติการแก้ไข 2014-11-21 17:00:29
Date :
2014-11-21 16:58:16
By :
progamer2000
เอาข้อมูลอะไรมาแสดงครับ ลองบอกมาว่าต้องการข้อมูลแบบไหนอะไรยังไงจะช่วยได้ง่ายกว่านะครับ ตัวอย่างเป็น count คนตอบก็ต้องคิดแบบนั้นสิครับ
Date :
2014-11-21 17:03:06
By :
phpinfo()
งั้นก็มันก็ผิดตั้งแต่คำถามแล้วล่ะครับ ถ้าคุณถามด้วยโครงสร้างข้อมูลจริงมันจะมองออกกว่านี้นะครับ ลองเอาโครงสร้างของทุกตารางมาดู แล้วบอกว่าต้องการแสดงแบบไหน คนตอบจะช่วยคิดช่วยตอบได้ตรงจุดครับ มันอาจจะไม่จบที่ JOIN ก็ได้ อาจจะมีเทคนิคอื่นอีก แต่ถ้าคำถามแบบนี้ ตัวอย่างแบบนี้ ก็คิดได้แค่นี้ล่ะครับ
Date :
2014-11-21 17:06:10
By :
phpinfo()
table products
---------------------
code name
1 แก้ว
2 จาน
3 ชาม
----------------------------
table tag
code product_code tag
1 1 1
2 1 2
3 3 1
-------------------------
table tag_detail
code name
1 สินค้าใหม่
2 สินค้ามาแรง
------------------------------------
ต้องการข้อมูลสินค้าจาก product ทั้งหมด ที่แสดง ชื่อ tag เรียงต่อกัน
code name tag
1 แก้ว สินค้าใหม่,สินค้ามาแรง
2 จาน สินค้ามาแรง
3. ชาม
Date :
2014-11-21 17:09:26
By :
progamer2000
ต้องการแสดงรายการสินค้า เรียงตาม จังหวัดอำเภอ ใช่ไหมครับ
รายการหลักที่แสดง คือรายการสินค้าหรือเปล่าครับ
แยกส่วนการคิวรี่
คิวรี่ จังหวัดเก็บเป็น array เอาไว้ $provinces[$province_row['id'] ]=$province_row;
คิวรี่ อำเภอ เก็บเป็น array ไว้ $ampurs[$ampur_row['id']]=$ampur_row;
ตำบลก็เมหือนกัน
คิวรี่ รายการสินค้า
echo $provinces[ $stock_row['province_id']]
, $ampurs[$stock_row['aumpur_id']]
, $tumbol[$stock_row['tumbol_id']];
ถ้าเอาโครงสร้าง ตารางมาให้ดูก็จะดีนะครับ
Date :
2014-11-21 17:12:16
By :
Chaidhanan
Code (SQL)
-- phpMyAdmin SQL Dump
-- version 3.1.3.1
-- http://www.phpmyadmin.net
--
-- โฮสต์: localhost
-- เวลาในการสร้าง:
-- รุ่นของเซิร์ฟเวอร์: 5.1.33
-- รุ่นของ PHP: 5.2.9
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- ฐานข้อมูล: `testquery`
--
-- --------------------------------------------------------
--
-- โครงสร้างตาราง `product`
--
CREATE TABLE IF NOT EXISTS `product` (
`code` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- dump ตาราง `product`
--
INSERT INTO `product` (`code`, `name`) VALUES
(1, 'จาน'),
(2, 'ชาม'),
(3, 'ช้อน'),
(4, 'ส้อม');
-- --------------------------------------------------------
--
-- โครงสร้างตาราง `product_tag`
--
CREATE TABLE IF NOT EXISTS `product_tag` (
`code` int(11) NOT NULL AUTO_INCREMENT,
`product_code` int(11) DEFAULT NULL,
`tag_code` int(11) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=5 ;
--
-- dump ตาราง `product_tag`
--
INSERT INTO `product_tag` (`code`, `product_code`, `tag_code`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 2, 3),
(4, 3, 2);
-- --------------------------------------------------------
--
-- โครงสร้างตาราง `tag`
--
CREATE TABLE IF NOT EXISTS `tag` (
`code` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
PRIMARY KEY (`code`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
--
-- dump ตาราง `tag`
--
INSERT INTO `tag` (`code`, `name`) VALUES
(1, 'สินค้ามาใหม่'),
(2, 'สินค้ามาแรง'),
(3, 'สินค้าพรีออเดอร์');
ใช้ข้อมูลจะส่งกลับเป็น json ครับผม
Date :
2014-11-21 17:18:42
By :
progamer2000
อันนี้คือ Query ที่ใช้อยู่ครับ
Code (SQL)
SELECT pd.code,pd.name,tp.tagname FROM product pd
LEFT JOIN (select product_code,GROUP_CONCAT(tag.name) as tagname from product_tag pt LEFT JOIN tag ON pt.tag_code = tag.code group by product_code) as tp ON tp.product_code = pd.code;
ประวัติการแก้ไข 2014-11-21 17:26:01 2014-11-21 17:28:48 2014-11-21 17:29:25
Date :
2014-11-21 17:24:43
By :
progamer2000
SELECT pd.code,pd.name,tp.tagname
FROM product pd
LEFT JOIN (
select product_code,GROUP_CONCAT(COALESCE( tag.name, '')) as tagname
from product_tag pt
LEFT JOIN tag ON pt.tag_code = tag.code
group by product_code
) as tp ON tp.product_code = pd.code;
เนื่องจากใช้ concat เจอค่า null ทำให้เป็น null ไปทั้งหมดครับ
ต้องตรวจสอบก่อน ตัวยคำสั่ง ตัวสีแดง
ประวัติการแก้ไข 2014-11-21 17:57:37
Date :
2014-11-21 17:57:11
By :
Chaidhanan
Load balance : Server 04