Tôi muốn trích xuất kết quả từ bảng EAV (thuộc tính-giá trị-thuộc tính), hoặc cụ thể hơn bảng siêu dữ liệu thực thể (nghĩ như wordpress wp_posts
và wp_postmeta
) bảng quan hệ đã định dạng ", để thực hiện một số sắp xếp và/hoặc lọc.Hiệu suất tốt nhất cho việc lấy kết quả EAV của MySQL là Bảng quan hệ
Tôi đã tìm thấy một số ví dụ về cách định dạng kết quả trong truy vấn (trái ngược với viết 2 truy vấn và tham gia kết quả trong mã), nhưng tôi muốn biết phương pháp "hiệu quả nhất" để làm như vậy, đặc biệt là cho các tập kết quả lớn hơn.
Và khi tôi nói "hiệu quả nhất", tôi muốn nói một cái gì đó giống như các tình huống sau:
Nhận tất cả các thực thể với tên cuối cùng như XYZ
Return một danh sách các thực thể được sắp xếp theo ngày sinh nhật
ví dụ: tắt chức năng này:
** ENTITY ** ----------------------- ID | NAME | whatever ----------------------- 1 | bob | etc 2 | jane | etc 3 | tom | etc ** META ** ------------------------------------ ID | EntityID | KEY | VALUE ------------------------------------ 1 | 1 | first name | Bob 2 | 1 | last name | Bobson 3 | 1 | birthday | 1983-10-10 . | 2 | first name | Jane . | 2 | last name | Janesdotter . | 2 | birthday | 1983-08-10 . | 3 | first name | Tom . | 3 | last name | Tomson . | 3 | birthday | 1980-08-10
vào đây:
** RESULTS ** ----------------------------------------------- EID | NAME | first name | last name | birthday ----------------------------------------------- 1 | bob | Bob | Bobson | 1983-10-10 2 | jane | Jane | Janesdotter | 1983-08-10 3 | tom | Tom | Tomson | 1980-08-10
vì vậy tôi có thể sắp xếp hoặc lọc theo bất kỳ trường nào meta.
Tôi đã tìm thấy một số đề xuất here, nhưng tôi không thể tìm thấy bất kỳ cuộc thảo luận nào hoạt động tốt hơn.
Tùy chọn:
- GROUP_CONCAT:
SELECT e.*, GROUP_CONCAT(CONCAT_WS('||', m.KEY, m.VALUE) ORDER BY m.KEY SEPARATOR ';;') FROM `ENTITY` e JOIN `META` m ON e.ID = m.EntityID
- Multi-Tham:
SELECT e.*, m1.VALUE as 'first name', m2.VALUE as 'last name', m3.VALUE as 'birthday' FROM `ENTITY` e LEFT JOIN `META` m1 ON e.ID = m1.EntityID AND m1.meta_key = 'first name' LEFT JOIN `META` m2 ON e.ID = m2.EntityID AND m2.meta_key = 'last name' LEFT JOIN `META` m3 ON e.ID = m3.EntityID AND m3.meta_key = 'birthday'
- coalescing:
SELECT e.* , MAX(IF(m.KEY= 'first name', m.VALUE, NULL)) as 'first name' , MAX(IF(m.KEY= 'last name', m.VALUE, NULL)) as 'last name' , MAX(IF(m.KEY= 'birthday', m.VALUE, NULL)) as 'birthday' FROM `ENTITY` e JOIN `META` m ON e.ID = m.EntityID
- Mã:
SELECT e.* FROM `ENTITY` e WHERE e.ID = {whatever};
trong PHP, tạo ra một đối tượng giữ chỗ từ kết quảSELECT m.* FROM `META` m WHERE m.EntityID = {whatever};
trong PHP, vòng lặp thông qua kết quả và gắn với đối tượng thực thể như:$e->{$result->key} = $result->VALUE
Cái nào tốt hơn nói chung và để lọc/sắp xếp?
câu hỏi liên quan:
Nếu có đặt cược về hiệu suất và chỉ có một cơ hội để quay, tôi 'd đi cho đa tham gia. –
Bạn cần một 'GROUP BY e.ID' trong các tùy chọn 1 và 3. –
Hãy xem [câu hỏi này] (http://dba.stackexchange.com/questions/9466/most-performant-sql-query-needed) trên dba.se – ConcernedOfTunbridgeWells