sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo UNIR dos columnas con un dato serializado?

MySQL no sabe qué es una serialización de PHP. Puede almacenar los ID de las categorías como una cadena en el siguiente formato:

2,4,5,10,...

Luego, use una combinación de SUBSTRING_INDEX() y FIND_IN_SET() Funciones de MySQL para comprobar la existencia de categories.id en ecommerce_products.catid :

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

Para seleccionar los títulos de categorías para cada registro de producto, debemos concatenar los títulos por GROUP_CONCAT() función, por lo que la consulta final sería algo como esto:

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

En este enfoque, es posible que deba usar $this->db->query(); para ejecutar la consulta manualmente.

Nota:
Como alternativa, puede usar lo siguiente para ON declaración:

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

Caso de prueba

Aquí está mi caso de prueba en 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;

Resultado:

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