sql >> Databáze >  >> RDS >> Mysql

Jak spojit dva sloupce s jedním serializovaným datem?

MySQL neví, co je serializace PHP. ID kategorií můžete uložit jako řetězec v následujícím formátu:

2,4,5,10,...

Poté použijte kombinaci SUBSTRING_INDEX() a FIND_IN_SET() Funkce MySQL pro kontrolu existence categories.id v ecommerce_products.catid :

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

Chcete-li vybrat názvy kategorií pro každý záznam produktu, musíme názvy zřetězit pomocí GROUP_CONCAT() funkce, Takže konečný dotaz by byl něco takového:

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

V tomto přístupu možná budete muset použít $this->db->query(); metoda pro ruční spuštění dotazu.

Poznámka:
Jako alternativu můžete použít následující pro ON prohlášení:

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

Testovací případ

Zde je můj testovací případ na 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;

Výsledek:

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. provedla uloženou proceduru Oracle ze serveru SQL pomocí funkce otevřeného dotazu

  2. Jak nasadit vysoce dostupný Canvas LMS s databázovým clusterem PostgreSQL

  3. Nastavte, které řádky se mají odstranit na mysql po použití kombinovaného jedinečného indexu w/ignore

  4. Spring boot použití zástupného symbolu ve vlastnostech aplikace