sql >> Database teknologi >  >> RDS >> Mysql

Hvordan JOINDER man to kolonner med én serialiseret data?

MySQL ved ikke, hvad en PHP-serialisering er. Du kan gemme ID'erne for kategorier som en streng i følgende format:

2,4,5,10,...
 

Brug derefter en kombination af SUBSTRING_INDEX() og FIND_IN_SET() MySQL-funktioner til at kontrollere eksistensen af ​​categories.id i ecommerce_products.catid :

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

For at vælge kategorititlerne for hver produktpost skal vi sammenkæde titlerne efter GROUP_CONCAT() funktion, Så den endelige forespørgsel ville være sådan her:

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
 

I denne tilgang skal du muligvis bruge $this->db->query(); metode til at køre forespørgslen manuelt.

Bemærk:
Som alternativ kan du bruge følgende til ON erklæring:

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

Test-case

Her er min test-case på 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;
 

Resultat:

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. Afslut MySQL uden at genstarte på El Capitan

  2. Hvordan kan jeg forespørge en Oracle Timestamp-kolonne i SQL-serveren over en forbundet serverforbindelse?

  3. Hvordan kan jeg bekræfte, at en database er Oracle, og hvilken version bruger den SQL?

  4. specialtegn i sql-forespørgsel