Register Register Member Login Member Login Member Login Forgot Password ??
PHP , ASP , ASP.NET, VB.NET, C#, Java , jQuery , Android , iOS , Windows Phone
 

Registered : 107,913

HOME > PHP > PHP Forum > วิธี JOIN 2 ตารางและนับจำนวนที่ตารางแรก???



 

วิธี JOIN 2 ตารางและนับจำนวนที่ตารางแรก???

 



Topic : 134367



โพสกระทู้ ( 3,539 )
บทความ ( 8 )



สถานะออฟไลน์




ผมมีตารางที่ 1 คือ users มีจำนวนทั้งหมด 142 แต่ถ้าใส่เงื่อนไข WHERE user_deleted = 0 จะเหลือ 139

Code (SQL)
CREATE TABLE IF NOT EXISTS `rdb_users` (
  `user_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_login` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'username (must be unique for use as login)',
  `user_email` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'email (must be unique for use as login)',
  `user_password` text COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'password',
  `user_display_name` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'display name for cloak the username',
  `user_create` datetime DEFAULT NULL COMMENT 'user created date/time',
  `user_create_gmt` datetime DEFAULT NULL COMMENT 'user created date/time in gmt 0',
  `user_lastupdate` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'user last update',
  `user_lastupdate_gmt` datetime NOT NULL DEFAULT current_timestamp() COMMENT 'user last update in gmt 0',
  `user_lastlogin` datetime DEFAULT NULL COMMENT 'user last login',
  `user_lastlogin_gmt` datetime DEFAULT NULL COMMENT 'user last login in gmt 0',
  `user_status` int(1) NOT NULL DEFAULT 0 COMMENT 'user status. 0=disabled, 1=enabled',
  `user_statustext` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'user status text for describe what happens. (untranslated.)',
  `user_deleted` int(1) NOT NULL DEFAULT 0 COMMENT 'user soft deleted. 0=not deleted, 1=deleted',
  `user_deleted_since` datetime DEFAULT NULL COMMENT 'user deleted since date/time',
  `user_deleted_since_gmt` datetime DEFAULT NULL COMMENT 'user deleted since date/time in gmt 0',
  PRIMARY KEY (`user_id`),
  UNIQUE KEY `user_login` (`user_login`),
  UNIQUE KEY `user_email` (`user_email`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='contain users account' AUTO_INCREMENT=142 ;



-----------------------

ตารางที่ 2 คือ users_roles มีคอลัมน์ user_id ที่ค่าไม่สัมพันธ์กับตาราง users คือมี user อยู่แต่จะไม่มี role เลยก็ได้

Code (SQL)
CREATE TABLE IF NOT EXISTS `rdb_users_roles` (
  `usersroles_id` bigint(20) NOT NULL AUTO_INCREMENT,
  `user_id` bigint(20) NOT NULL COMMENT 'refer to users.user_id',
  `userrole_id` bigint(20) NOT NULL COMMENT 'refer to user_roles.userrole_id',
  PRIMARY KEY (`usersroles_id`),
  KEY `user_id` (`user_id`),
  KEY `userrole_id` (`userrole_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='contain user''s roles relation' AUTO_INCREMENT=70 ;



----------------------

ทีนี้ต้องการนับจำนวนผู้ใช้จากตารางแรกเป็นหลัก
Code (SQL)
SELECT 
  COUNT(`users`.`user_id`) AS `total`

FROM `rdb_users` AS `users`

LEFT JOIN `rdb_users_roles` AS `users_roles`
  ON `users_roles`.`user_id` = `users`.`user_id`

WHERE 1
  AND `user_deleted` = 0

ผลลัพธ์ที่ได้จะเป็น 142 ทั้งที่ควรจะเป็น 139
อันนี้ผลลัพธ์ที่ได้ไม่ตรง ควรใช้คำสั่งอย่างไรดีครับ?

แต่ถ้าใส่เงื่อนไขเข้าไป เช่น ผู้ดูแลกรองหน้าที่ userrole_id = 3 ถ้าไม่มีเงื่อนไข user_deleted = 0 จะมีทั้งหมด 15 แต่เงื่อนไข user_deleted = 0 ต้องใส่ มันจึงเหลือ 12 ซึ่งกรณีนี้ดันนับถูก
Code (SQL)
SELECT 
  COUNT(`users`.`user_id`) AS `total`

FROM `rdb_users` AS `users`

LEFT JOIN `rdb_users_roles` AS `users_roles`
  ON `users_roles`.`user_id` = `users`.`user_id`

WHERE 1
  AND `user_deleted` = 0
  AND `users_roles`.`userrole_id` = 3

ข้างบนนี้ ถ้าไม่มี deleted = 0 จะต้องเป็น 15 แต่มันต้องมีเลยนับได้ 12 ซึ่งตรงเป๊ะ

แต่ถ้าไม่กรอง userrole_id เลยดันนับไม่ตรง ทำยังไงให้ไม่กรอง userrole_id แล้วนับได้ตรงครับ?



Tag : PHP, MySQL, MySQL







Move To Hilight (Stock) 
Send To Friend.Bookmark.
Date : 2019-10-20 15:44:44 By : mr.v View : 69 Reply : 5
 

 

No. 1



โพสกระทู้ ( 3,649 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Twitter Facebook

group สิครับ






แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-10-20 15:56:06 By : mongkon.k
 


 

No. 2



โพสกระทู้ ( 3,539 )
บทความ ( 8 )



สถานะออฟไลน์


group ไม่ได้ครับ มันจะไม่นับออกมาว่าเท่าไหร่แต่จะออกมาเป็น 1 1 1 1 ตามจำนวน users เลยซึ่งกิน memory มากกว่า
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-10-20 15:57:56 By : mr.v
 

 

No. 3



โพสกระทู้ ( 3,649 )
บทความ ( 0 )

สมาชิกที่ใส่เสื้อไทยครีเอท Hall of Fame 2012

สถานะออฟไลน์
Twitter Facebook

ตอบความคิดเห็นที่ : 2 เขียนโดย : mr.v เมื่อวันที่ 2019-10-20 15:57:56
รายละเอียดของการตอบ ::
COUNT(distinct(`users`.`user_id`)) AS `total`

แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-10-21 10:09:46 By : mongkon.k
 


 

No. 4



โพสกระทู้ ( 164 )
บทความ ( 0 )



สถานะออฟไลน์


Query แรกไม่ต้อง join ครับ เพราะต้องการนับจำนวนผู้ใช้จากตารางแรก
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-10-21 11:16:02 By : birdbird27
 


 

No. 5



โพสกระทู้ ( 3,539 )
บทความ ( 8 )



สถานะออฟไลน์


ถ้าไม่ join มันจะใช้เงื่อนไข AND `users_roles`.`userrole_id` = 3 ไม่ได้ครับ และตัว WHERE ตัวนี้มันค่อนข้าง dynamic คือแล้วแต่ผู้ใช้จะกรอง ดังนั้น LEFT JOIN มันต้องมีเผื่อไว้ดักรอเลย

ตอนนี้ผมใช้ COUNT(DISTINCT `users`.`user_id`) แทน


ประวัติการแก้ไข
2019-10-21 18:15:15
แสดงความคิดเห็นโดยอ้างถึง ความคิดเห็นนี้
Date : 2019-10-21 18:14:44 By : mr.v
 

   

ค้นหาข้อมูล


   
 

แสดงความคิดเห็น
Re : วิธี JOIN 2 ตารางและนับจำนวนที่ตารางแรก???
 
 
รายละเอียด
 
ตัวหนา ตัวเอียง ตัวขีดเส้นใต้ ตัวมีขีดกลาง| ตัวเรืองแสง ตัวมีเงา ตัวอักษรวิ่ง| จัดย่อหน้าอิสระ จัดย่อหน้าชิดซ้าย จัดย่อหน้ากึ่งกลาง จัดย่อหน้าชิดขวา| เส้นขวาง| ขนาดตัวอักษร แบบตัวอักษร
ใส่แฟลช ใส่รูป ใส่ไฮเปอร์ลิ้งค์ ใส่อีเมล์ ใส่ลิ้งค์ FTP| ใส่แถวของตาราง ใส่คอลัมน์ตาราง| ตัวยก ตัวห้อย ตัวพิมพ์ดีด| ใส่โค้ด ใส่การอ้างถึงคำพูด| ใส่ลีสต์
smiley for :lol: smiley for :ken: smiley for :D smiley for :) smiley for ;) smiley for :eek: smiley for :geek: smiley for :roll: smiley for :erm: smiley for :cool: smiley for :blank: smiley for :idea: smiley for :ehh: smiley for :aargh: smiley for :evil:
Insert PHP Code
Insert ASP Code
Insert VB.NET Code Insert C#.NET Code Insert JavaScript Code Insert C#.NET Code
Insert Java Code
Insert Android Code
Insert Objective-C Code
Insert XML Code
Insert SQL Code
Insert Code
เพื่อความเรียบร้อยของข้อความ ควรจัดรูปแบบให้พอดีกับขนาดของหน้าจอ เพื่อง่ายต่อการอ่านและสบายตา และตรวจสอบภาษาไทยให้ถูกต้อง

อัพโหลดแทรกรูปภาพ

Notice

เพื่อความปลอดภัยของเว็บบอร์ด ไม่อนุญาติให้แทรก แท็ก [img]....[/img] โดยการอัพโหลดไฟล์รูปจากที่อื่น เช่นเว็บไซต์ ฟรีอัพโหลดต่าง ๆ
อัพโหลดแทรกรูปภาพ ให้ใช้บริการอัพโหลดไฟล์ของไทยครีเอท และตัดรูปภาพให้พอดีกับสกรีน เพื่อความโหลดเร็วและไฟล์ไม่ถูกลบทิ้ง

   
  เพื่อความปลอดภัยและการตรวจสอบ กระทู้ที่แทรกไฟล์อัพโหลดไฟล์จากที่อื่น อาจจะถูกลบทิ้ง
 
โดย
อีเมล์
บวกค่าให้ถูก
<= ตัวเลขฮินดูอารบิก เช่น 123 (หรือล็อกอินเข้าระบบสมาชิกเพื่อไม่ต้องกรอก)







Exchange: Voake, Comcube, รับทำเว็บไซต์ รับเขียนโปรแกรม

Load balance : Server 03
ThaiCreate.Com Logo
© www.ThaiCreate.Com. 2003-2019 All Rights Reserved.
ไทยครีเอทบริการ จัดทำดูแลแก้ไข Web Application ทุกรูปแบบ (PHP, .Net Application, VB.Net, C#)
[Conditions Privacy Statement] ติดต่อโฆษณา 081-987-6107 , 08-9968-0655 อัตราราคา คลิกที่นี่