banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành *nix [Hỏi] Cách truy vấn MySQL cho 1 trường hợp  XML
  [Programming]   [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 27/12/2008 13:14:35 (+0700) | #1 | 164099
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Chào mọi người,

Mình có 1 vấn đề thế này với MySQL: giả sử có 1 table order trong đó có các trường name, product tương ứng là tên người mua và sản phẩm mua, VD 1 vài giá trị như sau:

Code:
name         product
1 A               chuoi
2 B               hoa
3 C               banh
4 A               tao
5 A               xoai
6 B               man
7 C               xoai
8 B               chuoi


Mình muốn lấy ra tên những người ko mua 'xoai' chẳng hạn (trong trường hợp trên là B). Mình thử làm với câu lệnh thế này:

Code:
SELECT name FROM order WHERE  product!='xoai' GROUP BY name;


nhưng như thế A và C vẫn được lấy do A và C mua thứ khác, nghĩa là ngoài dòng 5 và 7 thì các dòng còn lại đều hợp lệ.

Mình có thử 1 cách khác như sau:

Code:
SELECT name FROM order WHERE name NOT IN (SELECT name FROM order WHERE product='xoai') GROUP BY name;


Cách này hoạt động đúng nhưng cách này load khá nặng khi số lượng record lớn. Mình muốn tìm 1 phương án tối ưu hơn, rất mong mọi người giúp đỡ. Xin cảm ơn rất nhiều.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 28/12/2008 05:46:42 (+0700) | #2 | 164150
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Cám ơn bạn đã trả lời, nhưng cách làm của bạn vẫn ko được bạn à, nó vẫn dính vào trường hợp 1 mà mình nói ở bài đầu, tức là nếu A mua 'xoai' và những thứ khác thì câu lệnh đó chỉ loại 1 record A mua 'xoai' và giữ lại các record khác, cho nên A vẫn được chọn.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 28/12/2008 06:38:54 (+0700) | #3 | 164154
Genetic
Member

[Minus]    0    [Plus]
Joined: 11/07/2006 13:17:17
Messages: 114
Location: Hưng Yên
Offline
[Profile] [PM]
Uhm, vấn đề nan giải!
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 28/12/2008 09:23:55 (+0700) | #4 | 164135
Genetic
Member

[Minus]    0    [Plus]
Joined: 11/07/2006 13:17:17
Messages: 114
Location: Hưng Yên
Offline
[Profile] [PM]
Bạn thử chia 2 dữ kiện đó ra làm 2 table khác nhau

- Table Customers gồm 2 trường là ID và Name
- Table Orders gồm 2 trường là ID và Product

Bằng cách này bạn đánh số cho ID cho mỗi khách hàng, và nếu khách hàng đó mua loại hàng gì thì ID của họ sẽ lưu trong table Orders.

Khi muốn truy vấn bạn dùng JOIN

SELECT Customers.Name from Customers FULL JOIN Orders ON Customers.ID=Orders.ID WHERE Orders.Product<> 'xoai' ; 
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 31/12/2008 08:37:16 (+0700) | #5 | 164632
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]

Genetic wrote:
Bạn thử chia 2 dữ kiện đó ra làm 2 table khác nhau

- Table Customers gồm 2 trường là ID và Name
- Table Orders gồm 2 trường là ID và Product

Bằng cách này bạn đánh số cho ID cho mỗi khách hàng, và nếu khách hàng đó mua loại hàng gì thì ID của họ sẽ lưu trong table Orders.

Khi muốn truy vấn bạn dùng JOIN

SELECT Customers.Name from Customers FULL JOIN Orders ON Customers.ID=Orders.ID WHERE Orders.Product<> 'xoai' ; 
 


Mình có tìm ra 1 cách tối ưu so với phương án 2 mình đưa ra ở đầu dựa trên việc tách bảng như thế này:

Code:
SELECT DISTINCT Customers.name FROM Customers LEFT JOIN Orders ON Customers.ID=Orders.ID WHERE NOT (SELECT COUNT(Orders.ID) FROM  Orders WHERE Orders.ID=Customers.ID AND Orders.product!='xoai')

Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 31/12/2008 10:24:52 (+0700) | #6 | 164646
zerozeroone
Member

[Minus]    0    [Plus]
Joined: 24/12/2006 13:29:23
Messages: 149
Offline
[Profile] [PM]

learn2hack wrote:

Mình có tìm ra 1 cách tối ưu so với phương án 2 mình đưa ra ở đầu dựa trên việc tách bảng như thế này:

Code:
SELECT DISTINCT Customers.name FROM Customers LEFT JOIN Orders ON Customers.ID=Orders.ID WHERE NOT (SELECT COUNT(Orders.ID) FROM  Orders WHERE Orders.ID=Customers.ID AND Orders.product!='xoai')

 


Em thấy thế này thì cũng load nặng như cái đầu của anh đưa ra.
[Up] [Print Copy]
  [Question]   Re: [Hỏi] Cách truy vấn MySQL cho 1 trường hợp 31/12/2008 16:41:22 (+0700) | #7 | 164676
[Avatar]
learn2hack
Elite Member

[Minus]    0    [Plus]
Joined: 29/06/2006 16:32:37
Messages: 825
Offline
[Profile] [PM] [WWW]
Khác em à, cách đầu thì sẽ select tất cả những người mua 'xoai' rồi mới so sánh. Cách thứ 2 thì chỉ select đúng người đó và xem họ có mua 'xoai' ko thôi, nó có thêm điều kiện Orders.ID=Customers.ID nên sẽ hạn chế được rất nhiều.
Blog: http://hontap.blogspot.com
Tải phần mềm miễn phí: http://www.taiphanmem.org
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|