Chỉ sử dụng hai bảng:
Truy vấn ban đầu của bạn:
SELECT subscribers.email_address,
subscribers.first_name,
subscribers.last_name,
t1.value AS Languages
FROM subscribers
LEFT JOIN (SELECT subscriber_id,
field_id,
GROUP_CONCAT(value SEPARATOR '|') AS value
FROM subscribers_multivalued
WHERE field_id=37
GROUP BY subscriber_id, field_id
) AS t1
ON subscribers.subscriber_id=t1.subscriber_id
AND t1.field_id=37
WHERE (list_id=49)
AND (state=1)
đưa ra một kế hoạch giải thích về:
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY subscribers ref FK_list_id FK_list_id 4 const 2 Using where
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 5
2 DERIVED subscribers_multivalued ALL field_fk field_fk 4 11 Using filesort
Đề xuất tham gia của tôi:
SELECT subscribers.email_address,
subscribers.first_name,
subscribers.last_name,
GROUP_CONCAT(t1.value SEPARATOR '|') AS Languages
FROM subscribers
LEFT JOIN subscribers_multivalued t1
ON subscribers.subscriber_id=t1.subscriber_id
AND t1.field_id=37
WHERE (list_id=49)
AND (state=1)
GROUP BY subscribers.email_address,
subscribers.first_name,
subscribers.last_name
đưa ra một kế hoạch giải thích về:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE subscribers ref FK_list_id FK_list_id 4 const 2 Using where; Using filesort
1 SIMPLE t1 ref subscriber_fk,field_fk subscriber_fk 4 test.subscribers.subscriber_id 1
Mặc dù tôi chỉ điền vào hai bảng đó với một lượng dữ liệu rất nhỏ, điều này gợi ý cho tôi rằng phiên bản truy vấn của tôi sẽ thực thi hiệu quả hơn so với cơ sở dữ liệu, vì nó không sử dụng bảng dẫn xuất mà truy vấn của bạn tạo ra.
Các bảng khác có thể được liên kết với truy vấn theo cách tương tự và toàn bộ kết quả được lưu trực tiếp vào tệp csv thay vì được phân tích cú pháp thêm bằng PHP.
Điều này sẽ giúp bạn chạy nhanh hơn và tiết kiệm bộ nhớ hơn.
CHỈNH SỬA
SELECT subscribers.email_address,
subscribers.first_name,
subscribers.last_name,
GROUP_CONCAT(DISTINCT t1.value SEPARATOR '|') AS Colors,
GROUP_CONCAT(DISTINCT t2.value SEPARATOR '|') AS Languages
FROM subscribers
LEFT JOIN subscribers_multivalued AS t1
ON subscribers.subscriber_id=t1.subscriber_id
AND t1.field_id=112
LEFT JOIN subscribers_multivalued AS t2
ON subscribers.subscriber_id=t2.subscriber_id
AND t2.field_id=37
WHERE (list_id=49)
GROUP BY subscribers.email_address,
subscribers.first_name,
subscribers.last_name
Lưu ý việc sử dụng DISTINCT trong hàm GROUP_CONCAT ()