2015-04-22 14 views
7

Tôi có bốn bảng (trong [] là cột):mysql select/xóa bằng cách sử dụng tham gia hơn bốn bảng

users [id]

products [id]

productRatings [id,value,user,product]

comments [id,product,user]

tôi sẽ muốn chọn/và cuối cùng xóa productRatings khi không có nhận xét được liên kết cùng một người dùng cho sản phẩm đó. Tức là, nếu người dùng đã xếp hạng sản phẩm nhưng không nhận xét thì xếp hạng đó sẽ bị xóa.

Tôi tin rằng tôi có thể đạt được điều đó bằng cách sử dụng hai truy vấn, đầu tiên:

SELECT user, product FROM productRatings 

và sau đó cho mỗi hàng:

SELECT COUNT(*) FROM comments WHERE product=productRatings.product AND user=productRatings.user 

và sau đó một cái gì đó giống như

if $queryAbove==0 : DELETE FROM productRatings WHERE id=productRatings.id 

tôi sẽ muốn giải quyết điều này thông qua JOIN và tìm hiểu thêm bằng ví dụ thay vì đào qua các hướng dẫn JOIN.

Trả lời

4

Bạn chỉ cần productratings và ý kiến ​​bảng - các công việc sau:

delete pr 
from productratings pr 
left join comments c 
    on pr.userid = c.userid 
    and pr.productid = c.productid 
where c.productid is null 

Và có một bản demo ở đây: http://sqlfiddle.com/#!9/89575/1

+0

điều này đã làm điều đó, cảm ơn bạn, điều này tham gia thực sự đơn giản khi bạn biết bạn đang làm gì – dbr

0
DELETE FROM productRatings WHERE id IN (SELECT pr.id FROM productRatings pr 
     LEFT JOIN comments c on c.product = pr.product 
     WHERE c.user = pr.user 
     AND pr.comment IS NULL) 
+0

này không thực hiện những gì OP đã yêu cầu. Nó muốn xóa xếp hạng sản phẩm mà không có nhận xét nào tồn tại từ người dùng đã tạo xếp hạng sản phẩm. Không giữ nguyên nếu bất kỳ nhận xét nào tồn tại –

+0

@pala_ Cảm ơn bạn! Tôi đã nhanh. – smiggle

+0

điều này có khả năng sẽ thất bại trong đó 'WHERE id =' với một lựa chọn lồng nhau sẽ cung cấp nhiều hơn một kết quả. với việc bạn sử dụng 'IS NULL' có thể là' IN' thay vì '=' –

1

Bạn sẽ có thể chỉ cần tham gia các trường trong truy vấn và sau đó kiểm tra nếu nhận xét là trống rỗng, như vậy ...

DELETE FROM `productRatings` 
JOIN `comments` ON (`productRatings`.`product` = `comments`.`product`) 
WHERE `comments`.`comment_field` IS NULL 
AND `productRatings`.`user_id` = ?; 

Các IS NULL có thể cần phải được thay thế bằng = '' tùy thuộc vào công cụ cơ sở dữ liệu bạn sử dụng.

Hãy nhớ kiểm tra phiên bản thử nghiệm của DB trước tiên!

+0

Tôi không chắc bạn cần tham gia trên bảng người dùng vì cả bảng nhận xét và xếp hạng đều có id người dùng. –

+0

True, chỉnh sửa câu trả lời, cảm ơn bạn –

+0

Tôi nghĩ rằng điều này sẽ thất bại vì nó là một tham gia và bạn đã không chỉ định bảng nào cần xóa. –

2
DELETE FROM `productRatings` WHERE productRatings.id NOT IN (
SELECT productRatings.id FROM `productRatings` JOIN `comments` ON productRatings.user = comments.user AND productRatings.product = comments.product) 

Tôi sẽ sao chép các bảng được đề cập và kiểm tra xem các bảng trên có hoạt động trên các bảng thử nghiệm trước khi sử dụng trên bảng sản xuất của bạn hay không.

Về cơ bản, lựa chọn lồng nhau sẽ trả về tất cả id productRatings mà người dùng đã viết đánh giá cũng đã đưa ra nhận xét. Sử dụng NOT IN, nó sẽ xóa tất cả các xếp hạng mà người dùng thực hiện xếp hạng cũng không nhận xét.

Như pala_ được đánh dấu trong các ý kiến ​​dưới đây, vì phương pháp này sử dụng sql lồng nhau, nó sẽ hoạt động tồi tệ hơn một phương pháp chỉ sử dụng kết nối trên các bảng lớn hơn.

+0

cho các bảng lớn, điều này sẽ hoạt động kém hơn phiên bản chỉ sử dụng các kết nối. –

+0

@pala_ yea, tôi sẽ thêm điều đó vào câu trả lời của mình. Câu trả lời của bạn có vẻ tốt hơn ở chỗ nó không sử dụng sql lồng nhau. –

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