2015-07-22 17 views
6

Nó sẽ rất tuyệt vời nếu có ai đó sẽ cung cấp cho tôi một trợ giúp nhỏ trong mysql.Giao điểm Mysql của hai bộ có giá trị được phân tách bằng dấu phẩy

Tôi có một bảng có 1 tỷ bản ghi trong đó một cột có giá trị được phân tách bằng dấu phẩy.

Tôi có giá trị được phân cách bằng dấu phẩy để tìm kiếm.

Tôi muốn chọn những hàng có giá trị bất kỳ trong cột được tách nhau bằng dấu phẩy đó từ giá trị chuỗi đó.

ví dụ, Bảng là A có cột comma_separated như thế này: -

enter image description here

và tôi có một chuỗi có Comma Separated Values ​​"79, 62, 70, 107".

Ta được kết quả hàng số 1,2,3,5,7,8,9,10 (Trong đề cập đến hình ảnh.)

tôi đã làm nó với regex nhưng có thể mất quá nhiều thời gian, vì vậy tôi muốn tránh điều này cho mục đích tối ưu hóa.

+0

Hãy chỉ cho chúng ta nỗ lực của bạn. –

+0

Nó là thiết kế cơ sở dữ liệu rất xấu! – Jens

+0

Một giải pháp khác tôi đang suy nghĩ để làm điều đó với chức năng được lưu trữ (mà sẽ sử dụng vòng lặp với hàm find_in_set) mà sẽ cung cấp boolean để thiết lập và sử dụng trong truy vấn. Nhưng không biết làm thế nào để làm điều đó. –

Trả lời

2

Bạn thực sự không thể tối ưu hóa những gì bạn đang làm. Về cơ bản, bạn có thể chạy truy vấn như sau:

where find_in_set(79, comma_separated) > 0 or 
     find_in_set(62, comma_separated) > 0 or 
     find_in_set(70, comma_separated) > 0 or 
     find_in_set(107, comma_separated) > 0 

Điều này yêu cầu quét toàn bộ bảng. Và, mặc dù hiệu suất có thể tốt hơn một chút so với biểu thức chính quy, nhưng nó vẫn sẽ không hiệu quả.

Cách thích hợp để lưu trữ dữ liệu này là bảng nối. Điều này nhân số hàng, do đó hàng đầu tiên trong dữ liệu của bạn sẽ trở thành ba hàng trong bảng giao nhau (một hàng cho mỗi giá trị).

Có nhiều lý do khiến bạn không muốn lưu trữ danh sách những thứ dưới dạng danh sách được phân cách bằng dấu phẩy. Các giá trị của bạn trông giống như id trong bảng khác, làm cho mọi thứ trở nên tồi tệ hơn:

  • Giá trị phải được lưu trữ ở định dạng gốc. Vì vậy, việc lưu trữ các số nguyên dưới dạng chuỗi là một ý tưởng tồi.
  • Cấu trúc gốc cho danh sách trong SQL là một bảng chứ không phải danh sách.
  • Các chức năng trên bảng có nhiều chức năng chuỗi và mạnh hơn.
  • SQL không thể sử dụng các chỉ mục (ngoại trừ các chỉ mục văn bản đầy đủ) cho các hoạt động chuỗi.
  • Khi bạn có một id tham chiếu đến một bảng khác, bạn nên có ràng buộc khóa ngoài. Bạn không thể làm điều đó với các danh sách được lưu trữ trong một chuỗi.
0

Nếu bạn quan tâm đến hiệu suất, bạn nên xem xét sửa đổi cấu trúc của DB của bạn. Các số không lập chỉ mục tốt (nếu có) trong các loại cột dựa trên văn bản.

Dường như bạn có số nguyên không đổi trong cột "dấu phẩy".

Cân nhắc việc tạo cột loại INT riêng biệt cho từng trong ba cột, tức là:

num1 | num2 | num3 
79 | 62 | 101 
101 | 5 | 70 

Sau đó, bạn có thể làm lựa chọn thích hợp như:

WHERE 
    num1 IN (79, 62, 70, 107) 
    OR num2 IN (79, 62, 70, 107) 
    OR num3 IN (79, 62, 70, 107) 
Các vấn đề liên quan