Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Số lượng thuộc tính tìm kiếm theo mặt

Đây là cách bạn có thể làm điều này:

SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
  FROM meta m JOIN item_meta im
    ON im.field_id = m.id
 GROUP BY meta_name, meta_value

Đầu ra:

|      META_NAME | META_VALUE | COUNT |
|----------------|------------|-------|
|       Car Type |      Coupe |     2 |
|       Car Type |      Sedan |     1 |
|          Color |      Black |     1 |
|          Color |        Red |     1 |
|          Color |      White |     1 |
| Interior Color |      Black |     2 |
| Interior Color |       Grey |     1 |
|           Make |        BMW |     2 |
|           Make |      Honda |     1 |
|          Model |    2Series |     1 |
|          Model |    3Series |     1 |
|          Model |      Civic |     1 |

Đây là SQLFiddle bản demo

CẬP NHẬT:

Đã lọc:

SELECT meta_name, meta_value, COUNT(DISTINCT item_id) count
  FROM meta m JOIN item_meta im
    ON im.field_id = m.id
 WHERE item_id IN
(
  SELECT i.id
  FROM item_meta im JOIN items i
    ON im.item_id = i.id JOIN meta m
    ON im.field_id = m.id
 GROUP BY i.id
HAVING MAX(meta_name = 'Make' AND meta_value = 'BMW') = 1
   AND MAX(meta_name = 'Car Type' AND meta_value = 'Coupe') = 1
)
 GROUP BY meta_name, meta_value;

Đầu ra:

|      META_NAME | META_VALUE | COUNT |
|----------------|------------|-------|
|       Car Type |      Coupe |     2 |
|          Color |      Black |     1 |
|          Color |      White |     1 |
| Interior Color |      Black |     1 |
| Interior Color |       Grey |     1 |
|           Make |        BMW |     2 |
|          Model |    2Series |     1 |
|          Model |    3Series |     1 |

Đây là SQLFiddle bản demo

CẬP NHẬT2:

Nó rất dễ dàng. Đương nhiên thay vì sử dụng AND trong HAVING mệnh đề (ô tô không thể có màu đen và đỏ cùng một lúc) bạn phải sử dụng OR như vậy

HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') = 1
    OR MAX(meta_name = 'Color' AND meta_value = 'Red')   = 1

hoặc đây là một cách khác để thể hiện cùng một mục đích

HAVING MAX(meta_name = 'Color' AND meta_value = 'Black') +
       MAX(meta_name = 'Color' AND meta_value = 'Red') > 0

Đây là SQLFiddle bản demo



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cập nhật hai hàng khác nhau trong một dòng SQL

  2. Socket Exceptions khi cố gắng kết nối với cơ sở dữ liệu MySql từ gitpod IDE (máy chủ ubuntu)

  3. CHỌN * NƠI KHÔNG TỒN TẠI

  4. Thay đổi thủ tục lưu trữ MySQL tên 'Đối chiếu cơ sở dữ liệu'

  5. Sao lưu cơ sở dữ liệu logic bằng MySQL Shell