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

Làm thế nào để THAM GIA hai cột với một dữ liệu được tuần tự hóa?

MySQL không biết tuần tự hóa PHP là gì. Bạn có thể lưu trữ ID của các danh mục dưới dạng một chuỗi ở định dạng sau:

2,4,5,10,...

Sau đó, sử dụng kết hợp SUBSTRING_INDEX () FIND_IN_SET () Các hàm MySQL để kiểm tra sự tồn tại của categories.id trong ecommerce_products.catid :

SUBSTRING_INDEX(
    SUBSTRING_INDEX(ecommerce_products.catid,
        ',',
        FIND_IN_SET(categories.id, ecommerce_products.catid)
), ',', -1)

Để chọn tiêu đề danh mục cho mỗi bản ghi sản phẩm, chúng ta cần nối các tiêu đề với GROUP_CONCAT() hàm, Vì vậy, truy vấn cuối cùng sẽ giống như sau:

SELECT p.id,
       p.catid
       GROUP_CONCAT(cat.title ORDER BY cat.id SEPARATOR '|') as 'categories',
       p.manid,
       p.name
FROM ecommerce_products AS p
LEFT JOIN categories AS cat
    ON cat.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.catid, ',', FIND_IN_SET(cat.id, p.catid)), ',', -1)
-- more query...
GROUP BY p.id; -- Group the result to concatenate the categories titles

Trong cách tiếp cận này, bạn có thể cần sử dụng $this->db->query(); để chạy truy vấn theo cách thủ công.

Lưu ý:
Để thay thế, bạn có thể sử dụng phần sau để ON tuyên bố:

LEFT JOIN categories AS cat
    ON p.catid REGEXP CONCAT('[,]{0,1}', cat.id, '[,]{0,1}')

Trường hợp thử nghiệm

Đây là trường hợp thử nghiệm của tôi trên SQLFiddle :

SELECT p.id,
       p.name,
       GROUP_CONCAT(c.title ORDER BY c.id SEPARATOR '|') as 'categories'
FROM products as p
JOIN categories as c
  ON c.id = SUBSTRING_INDEX(SUBSTRING_INDEX(p.cat_id, ',', FIND_IN_SET(c.id, p.cat_id)) , ',', -1)
GROUP BY p.id;

Kết quả:

ID    NAME          CATEGORIES
--    ---------     -----------
1     Product 1     Cat 1|Cat 3
2     Product 2     Cat 2|Cat 4
3     Product 3     Cat 1|Cat 4
4     Product 4     Cat 2|Cat 3


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng SparkSession.sql () với JDBC

  2. Hợp nhất hai cột, nhiều hàng bỏ qua các bản sao - MySQL

  3. Bao gồm số hàng dưới dạng cột trong MySQL INSERT

  4. Bộ nhớ đệm của PreparedStatement - nghĩa là gì (nó hoạt động như thế nào)

  5. Hiển thị các giá trị có trong Bảng2 nhưng KHÔNG có trong Bảng1