2013-06-13 60 views
5

Tôi có bảng thư mục nhà cung cấp trong cơ sở dữ liệu MySQL có bảng ánh xạ nhà cung cấp liên quan. Bảng này ánh xạ các tiêu chí sau đối với nhà cung cấp cá nhân:MySQL chọn dựa trên giá trị ENUM

  1. Dịch vụ.
  2. Specialties
  3. Tiêu chuẩn

Chỉ cần để biết nền mỗi một trong các giá trị đã được lưu trữ trong các bảng tương ứng với 3 cá nhân. Tất cả các dịch vụ có thể được cung cấp bởi bất kỳ nhà cung cấp nào được liệt kê trong bảng dịch vụ và bảng ánh xạ sẽ thu thập các dịch vụ được cung cấp bởi một nhà cung cấp cá nhân. Một nhà cung cấp có thể cung cấp nhiều dịch vụ để họ có thể lập bản đồ cho từng dịch vụ mà họ cung cấp. Cùng đi cho các đặc sản và tiêu chuẩn.

Nơi tôi gặp sự cố là trên truy vấn tìm kiếm nơi người dùng có thể truy vấn danh sách nhà cung cấp trên bất kỳ một hoặc tất cả ba tiêu chí ở trên. Vì vậy, ví dụ họ có thể tìm kiếm một nhà cung cấp với dịch vụ a, đặc sản b và tiêu chuẩn c. Họ không thể tìm kiếm nhiều giá trị trên một dịch vụ, đặc biệt hoặc tiêu chuẩn

bảng ánh xạ của tôi trông giống như sau:

id int(11) unsigned NOT NULL 
supplier_id int(11) unsigned NOT NULL 
entity_type enum('KEY_SERVICE','STANDARD','SPECIALITY') NOT NULL 
entity_id int(11) NOT NULL 

đâu bản đồ ENTITY_TYPE được sử dụng để chỉ các loại thực thể được ánh xạ và ENTITY_ID chỉ ra thực thể riêng lẻ.

truy vấn của tôi là như sau:

SELECT DISTINCT supplier_mappings.supplier_id, suppliers.company_name 
FROM supplier_mappings 
JOIN suppliers ON suppliers.id = supplier_mappings.supplier_id 
WHERE (supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

mà phải trả lại tất cả các nhà cung cấp có một dịch vụ quan trọng với id 55, một đặc sản với id 218 và một tiêu chuẩn với id 15. Tuy nhiên nó chỉ trở lại một tập kết quả trống mặc dù tôi biết có ít nhất một nhà cung cấp được xác định. Nó dường như là một cái gì đó để làm với các mệnh đề AND phức tạp nhưng không thể tìm ra những gì.

Bạn sẽ đánh giá cao nếu có ai có ý tưởng nào?

+0

Bạn có thể tạo một số dữ liệu mẫu với các bảng của bạn và đặt nó vào một Fiddle SQL? – Kermit

+0

Xem http://sqlfiddle.com/#!2/bddae/2. Hy vọng đó là đúng như đã không được sử dụng SQL Fiddle trước. Nếu tôi tìm kiếm nhà cung cấp có dịch vụ chính = 1, đặc sản = 1 và tiêu chuẩn = 3, nhà cung cấp phải trả lại Nhà cung cấp 1 và Nhà cung cấp 4. –

Trả lời

3

Nếu bạn có một cái nhìn ở điều kiện của truy vấn của bạn:

(supplier_mappings.entity_type = 'KEY_SERVICE' VÀ supplier_mappings.entity_id = '55') AND (supplier_mappings.entity_type = 'CHUYÊN' VÀ supplier_mappings.entity_id = '218') AND (supplier_mappings.entity_type = 'CHUẨN' VÀ supplier_mappings.entity_id = '15')

Ví dụ: supplier_mappings.entity_type = 'KEY_SERVICE' VÀ supplier_mappings.entity_type = 'CHUYÊN' sẽ trở lại luôn Giá trị FALSE.

Bạn phải sử dụng một điều kiện bảng foreach riêng biệt, như thế này

SELECT DISTINCT suppliers.ID, suppliers.company_name 
      FROM suppliers, 
       supplier_mappings mapA, 
       supplier_mappings mapB, 
       supplier_mappings mapC 
      WHERE suppliers.ID = mapA.supplier_id 
      AND suppliers.ID = mapB.supplier_id 
      AND suppliers.ID = mapC.supplier_id 
      AND mapA.entity_type = 'KEY_SERVICE' AND mapA.entity_id = '55' 
      AND mapB.entity_type = 'SPECIALITY' AND mapB.entity_id = '218' 
      AND mapC.entity_type = 'STANDARD'  AND mapC.entity_id = '15'; 
+0

Bingo. Đó là vé. Chúc mừng. –

1

Hãy nhìn vào logic boolean của bạn.Cuối cùng bạn có một chức năng kết hợp ("VÀ")

vì vậy đây

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
AND (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
AND (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 

sẽ trở thành sự thật chỉ cho cái gì đó có cả hai

supplier_mappings.entity_type = 'SPECIALITY' 

supplier_mappings.entity_type = 'KEY_SERVICE' 

Không có cách nào có thể là những thứ này cùng một lúc. (điều này cũng đúng với giá trị thứ ba và id theo cách này). Bạn không muốn TẤT CẢ những thứ này cùng một lúc. Một ví dụ sẽ là một trường hợp simpeler: Nếu bạn muốn từ một bảng đơn giản cả hai hàng có id=3 và các hàng có id=4, logic của bạn sẽ KHÔNG là WHERE id=3 AND id=4, bởi vì không có hàng nào có cả hai. Thay vào đó, bạn muốn yêu cầu WHERE id=3 OR id=4

thay vì (tôi không chắc chắn này là hoàn toàn sửa chữa tất cả mọi thứ, nhưng nó sẽ giúp bạn đi), bạn muốn làm một HOẶC cho những trường hợp riêng biệt:

(supplier_mappings.entity_type = 'KEY_SERVICE' AND supplier_mappings.entity_id = '55') 
OR (supplier_mappings.entity_type = 'SPECIALITY' AND supplier_mappings.entity_id = '218') 
OR (supplier_mappings.entity_type = 'STANDARD' AND supplier_mappings.entity_id = '15'); 
+0

Sử dụng OR sẽ hoạt động nhưng điều đó có nghĩa là nó sẽ trả lại kết quả nếu có bất kỳ điều kiện nào phù hợp, tôi cần đảm bảo rằng tất cả các điều kiện đều phù hợp. –

+0

điều đó là không thể, bạn không thể có thứ gì đó là 2 thứ cùng một lúc – Nanne

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