Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak JOIN dwie kolumny z jednym serializowanymi danymi?

MySQL nie wie, czym jest serializacja PHP. Możesz przechowywać identyfikatory kategorii jako ciąg w następującym formacie:

2,4,5,10,...

Następnie użyj kombinacji SUBSTRING_INDEX() i ZNAJDŹ_IN_SET() Funkcje MySQL sprawdzające istnienie categories.id w ecommerce_products.catid :

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

Aby wybrać tytuły kategorii dla każdego rekordu produktu, musimy połączyć tytuły według GROUP_CONCAT() funkcja, więc końcowe zapytanie wyglądałoby mniej więcej tak:

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

W tym podejściu może być konieczne użycie $this->db->query(); metoda ręcznego uruchomienia zapytania.

Uwaga:
Alternatywnie możesz użyć następującego dla ON oświadczenie:

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

Przypadek testowy

Oto mój przypadek testowy 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;

Wynik:

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. Zapytanie SQL, aby uzyskać różnicę między sąsiednimi rekordami

  2. mysql match/przeciwko

  3. Aby przygotować plan dla mojego pierwszego projektu MySQL

  4. #2006 MySQL Server zniknął błąd w Wamp

  5. Blokowanie MySQL w błędzie zduplikowanego klucza