Tôi có một bảng chứa một số bài viết có ID riêng và khóa SKU dùng chung. Tôi đã thử thực hiện một truy vấn bằng cách sử dụng phép nối trái và sử dụng kết quả nhóm để nhận tất cả các id được trả về từ truy vấn.
Cấu trúc dữ liệu của tôi là như thế này:
id - tên - sku - ...
1 - felix - mèo
2 - tom - mèo - ...
3 - sylvester - mèo - ...
4 - đỏ - bút - ...
5 - xanh - bút - ...
Tôi cố gắng sử dụng truy vấn này:
CHỌN * TỪ `test`
[TRÁI/PHẢI/BÊN TRONG] THAM GIA
(
CHỌN GROUP_CONCAT(ID DISTINCT) LÀ idsgroup TỪ `test` Ở ĐÂU (tên_thuộc_tính = 'sku') NHÓM THEO tên_giá_trị GIỚI HẠN 0, 3
) ràng buộc
TRÊN id TRONG (bind.idsgroup);
Truy vấn này sai, nó chỉ trả về 1 id cho mỗi nhóm thay vì tất cả các id được chọn từ trường hợp concat hoặc LEFT JOIN, rõ ràng là tất cả các hàng.
Có cách giải quyết nào được đề xuất để đạt được kết quả chính xác không?
biên tập:
Đây là một cấu trúc: http://sqlfiddle.com/#!9/b6747a
Truy vấn tôi đã thử:
CHỌN * TỪ `view_test`
NỐI BÊN TRONG
(
CHỌN GROUP_CONCAT(DISTINCT entity_id) LÀ idsgroup TỪ `view_test` Ở ĐÂU (tên_thuộc_tính = 'sku') NHÓM THEO tên_giá_trị GIỚI HẠN 0, 3
) ràng buộc
TRÊN entity_id IN (bind.idsgroup);
Như hình ảnh này hiển thị, kết quả của tôi thiếu một số ID là một phần của nhóm.
EDIT 2: Sau khi tôi sử dụng FIND_IN_SET() theo đề xuất của Kickstart, kết quả như mong đợi:
CHỌN * TỪ `view_test`
NỐI BÊN TRONG
(
CHỌN GROUP_CONCAT(DISTINCT entity_id) LÀ idsgroup TỪ `view_test` Ở ĐÂU (tên_thuộc_tính = 'sku') NHÓM THEO tên_giá_trị GIỚI HẠN 0, 3
) ràng buộc
TRÊN FIND_IN_SET(entity_id, bind.idsgroup);
Cách khắc phục đơn giản có vẻ là sử dụng FIND_IN_SET để kết nối. Nhưng nó hơi cồng kềnh và sẽ không nhanh như vậy.
LỰA CHỌN *
TỪ `view_test`
NỐI BÊN TRONG
(
CHỌN GROUP_CONCAT(DISTINCT entity_id) NHƯ idsgroup
TỪ `view_test`
NƠI (tên_thuộc_tính = 'sku')
NHÓM THEO value_name
GIỚI HẠN 0, 3
) ràng buộc
TRÊN FIND_IN_SET(entity_id, bind.idsgroup);
Không chắc tại sao truy vấn phụ lại có GIỚI HẠN, đặc biệt là không có mệnh đề đặt hàng.
Tốt hơn hết bạn nên sử dụng truy vấn con để lấy DISTINCTEntity_id với sku attribute_name và tham gia vào chúng.
LỰA CHỌN *
TỪ `view_test`
NỐI BÊN TRONG
(
CHỌN DISTINCT entity_id
TỪ `view_test`
NƠI (tên_thuộc_tính = 'sku')
) ràng buộc
TRÊN view_test.entity_id = bind.entity_id
Tôi là một lập trình viên xuất sắc, rất giỏi!