2011-11-09 33 views
8

Vẫn đang học các dây cáp của MySQL và tôi đang cố gắng tìm hiểu cách thực hiện một lựa chọn cụ thể liên quan đến nhiều người. Tôi xin lỗi nếu tên bảng là quá chung chung, tôi chỉ làm một số bài tập tự thực hiện. Tôi cố hết sức để trở thành một người tự học.MySQL Nhiều người chọn nhiều

Tôi có 3 bảng trong đó có một bảng liên kết. Làm cách nào để viết tuyên bố có nội dung là "Hiển thị người dùng sở hữu cả điện thoại HTC và điện thoại Samsung" (họ sở hữu 2 điện thoại). Tôi đoán câu trả lời là trong câu lệnh WHERE nhưng tôi không thể tìm ra cách để từ đó.

-- Table: mark3 
+---------+-----------+ 
| phoneid | name  | 
+---------+-----------+ 
|  1 | HTC  | 
|  2 | Nokia  | 
|  3 | Samsung | 
|  4 | Motorolla | 
+---------+-----------+ 

-- Table: mark4 
+------+---------+ 
| uid | phoneid | 
+------+---------+ 
| 1 |  1 | 
| 1 |  2 | 
| 2 |  1 | 
| 2 |  3 | 
| 2 |  4 | 
| 3 |  1 | 
| 3 |  3 | 
+------+---------+ 

-- Table: mark5 
+------+-------+ 
| uid | name | 
+------+-------+ 
| 1 | John | 
| 2 | Paul | 
| 3 | Peter | 
+------+-------+ 

Trả lời

12

Chìa khóa nằm trong GROUP BY/HAVING bằng cách sử dụng COUNT tên điện thoại DISTINCT. Khi đếm được 2, bạn sẽ biết người dùng có cả hai điện thoại.

SELECT m5.name 
    FROM mark5 m5 
     INNER JOIN mark4 m4 
      ON m5.uid = m4.uid 
     INNER JOIN mark3 m3 
      ON m4.phoneid = m3.phoneid 
    WHERE m3.name in ('HTC', 'Samsung') 
    GROUP BY m5.name 
    HAVING COUNT(DISTINCT m3.name) = 2; 
+0

Cảm ơn rất nhiều Joe! – enchance

+2

@enchance: Không có gì nói "cảm ơn" như một câu trả lời được chấp nhận. :-) –

+0

Bạn hiểu rồi, anh bạn. Ngoài ra, thay vì gọi bảng 'mark5' bạn đã làm nó thành m5, tôi không biết bạn có thể làm điều đó chỉ bằng cách viết nó sau tên bảng. Đó có phải là AS tương đương với tên cột không? – enchance

0

Câu trả lời Tôi nghĩ rằng bạn đang tìm kiếm là:

"SELECT DISTINCT mark5.name FROM mark5 JOIN mark4 ON (mark4.uid = mark5.uid) JOIN mark3 ON (mark3.phoneid = mark4.phoneid) WHERE mark3.name = 'HTC' && mark3.name = 'Samsung'" 

Tôi tin rằng sẽ giải đáp thắc mắc của bạn, nơi bạn đang kéo các tên biệt từ mark5 và tham gia các bảng khác của bạn trên những giá trị cụ thể mà tên điện thoại là HTC hoặc Samsung

+3

Tôi khá chắc chắn bạn không thể sử dụng && thay cho AND, nhưng tôi có thể sai. Bất kể, điều đó sẽ không bao giờ trả về bất kỳ hàng nào bởi vì một tên điện thoại không thể là cả HTC và Samsung cùng một lúc. –

+0

Không trả lại bất cứ điều gì. Câu trả lời của Joe tốt hơn nhiều. – enchance

Các vấn đề liên quan