2011-08-17 45 views
6

ai đó có thể giúp tôi xây dựng một truy vấn dựa trên truy vấn dưới đây.Truy vấn MySQL - nhiều mệnh đề WHERE trên 1 cột

Như bạn có thể thấy tôi có một sản phẩm có thông số kỹ thuật và một số nhóm được xây dựng trong giao diện người dùng. Tôi biết vấn đề, 1 cột không thể là 2 giá trị cùng một lúc nhưng tôi chỉ cần những sản phẩm nằm trong 2 nhóm đó.

Để minh họa, product_specification_sid, id 2 3 và 4 là kích cỡ và de còn lại 8 ~ 11 là màu sắc, vì vậy tôi muốn chọn một sản phẩm mà có 2 và 3.

Nội gia nhập bảng đôi isn' t một tùy chọn vì các nhóm (kích thước, màu sắc) có thể thay đổi trong tương lai.

SELECT 
    products.*, 
    categories.*, 
    manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE 
    product_active = 1 
AND 
(
    product_specification_sid in (3) 
AND 
    product_specification_sid in (8,9,6,7,10,11) 
) 
GROUP BY product_id 
+1

Tôi đã đăng một câu trả lời đã làm việc tham gia bên trong hai lần. Nhưng sau đó tôi đọc bạn tuyên bố rằng bạn đã nghĩ về điều đó. Tôi không hiểu tại sao bạn nói nó không phải là một lựa chọn? – Eljakim

Trả lời

5

Bạn có thể sử dụng mệnh đề có thay thế.

SELECT 
    products.*, 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE product_active = 1 
GROUP BY product_id 
HAVING COUNT(CASE WHEN product_specification_sid in (3) THEN 1 END) > 0 
AND COUNT(CASE WHEN product_specification_sid in (8,9,6,7,10,11) THEN 1 END) > 0 
+2

Những người có điều kiện là '> 1'? Tôi sẽ nghĩ '> = 1' /'> 0' hoặc '= 1'. –

+1

Truy vấn không hoạt động lúc đầu nhưng @Sam DeHaan đã sửa nó! Tôi thay thế các> 1 bij> = 1 và nó hoạt động như một say mê! – PvdL

+0

Tôi đã thay đổi truy vấn ngay bây giờ. –

1

Như tôi đã hiểu, bạn đang tìm kiếm bản ghi sản phẩm có hai bản ghi phù hợp với product_specification đáp ứng các điều kiện nhất định. Âm thanh với tôi giống như giải pháp đơn giản là:

SELECT products.*, categories.*, manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ps1 ON ps1.product_specification_pid=product_id 
INNER JOIN product_specifications ps2 ON ps2.product_specification_pid=product_id 
WHERE  product_active = 1 
    AND ps1.product_specification_sid in (3) 
    AND ps2.product_specification_sid in (8,9,6,7,10,11) 

Nhân tiện, "nhóm này" sẽ không hoạt động. Bạn phải nhóm theo mọi thứ không phải là tổng hợp và mỗi bảng phải có ít nhất một cột, vì vậy bạn có ít nhất ba nhóm không phải tổng hợp. (Vâng, có lẽ MySQL có một số phần mở rộng ở đây, nhưng trong SQL tiêu chuẩn sẽ được yêu cầu.)

+0

như tôi đã nói trong phần mô tả, sự tham gia của INNER không phải là một giải pháp (tuyệt vời) vì nó phải năng động về số lượng các nhóm thông số kỹ thuật. Truy vấn được tuyên bố bởi @ a'r đã hoạt động và tôi đang sử dụng MySQL như đã nêu trong các thẻ – PvdL

+0

Nếu bạn đã có giải pháp hoạt động, tuyệt vời, không cần phải đánh bại thêm nữa. Nhưng tôi tò mò: Tại sao một sự tham gia bên trong không hiệu quả với bạn? – Jay

+0

vì tôi sẽ gặp rắc rối với kết quả. Nếu bạn muốn phương pháp của mình hoạt động, bạn nên thêm GROUP BY ID HAVING COUNT (*)> = 2 Để khớp với 2 câu lệnh nhưng nếu không có kích thước, nó sẽ có thể khớp với màu đó . Vì vậy, về cơ bản không có trung bình nhưng màu xanh và đen sẽ cho một (sai) tích cực. Đây là cách tiếp cận đầu tiên của tôi quá :) Bên cạnh đó, nếu tôi không nhầm tất cả các bên trong đó tạo ra nhiều tải hơn thì phương pháp trên – PvdL

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