jeudi 28 avril 2016

SQLite many to many join and grouop

This is a very normal setup for many-to-many relational tables.

  1. product list and category list.
  2. Each product belongs to (0,n) category.
  3. Each category contains (0,n) product.

TABLES

CREATE TABLE product (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL);

CREATE TABLE category (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name TEXT NOT NULL);

CREATE product_category (
    product_id INTEGER NOT NULL,
    category_id INTEGER NOT NULL);

PRODUCT table

| id | name |
=============
| 1  |  p1  |
| 2  |  p2  |
| 3  |  p3  |

CATEGORY table

| id | name |
=============
| 1  |  c1  |
| 2  |  c2  |
| 3  |  c3  |

PRODUCT_CATEGORY table

| product_id | category_id |
============================
|     1      |      1      |
|     1      |      2      |
|     1      |      3      |
|     2      |      1      |
|     2      |      2      |
|     3      |      1      |

Question

I would like to know how to query for product by category_id and have the product listed with all category_id that it is in.

For example, I want to query the list of products that are available in category = 1, and the result must contain a categories_id where all categories that the product belongs to must be listed.

Expected output

| product_id | product_name | categories_id |
=============================================
|     1      |      p1      |     1,2,3     |
|     2      |      p2      |     1,2       |
|     3      |      p3      |     1         |

Attempts

I know this can be done with sub query, but I would like to know whether this can be achieved by JOIN statement?

I have tried the following query but the results does not reflect what I want.

JOIN QUERY statement

SELECT
    P.id AS product_id,
    P.name AS product_name,
    GROUP_CONCAT(PC.category_id, ',') AS categories_id
        FROM product AS P
            LEFT JOIN product_category AS PC
                ON P.id = PC.product_id
        WHERE PC.category_id = 1
        GROUP BY P.id;

Output (not as intended)

| product_id | product_name | categories_id |
=============================================
|     1      |      p1      |     1         |
|     2      |      p2      |     1         |
|     3      |      p3      |     1         |

Can anyone advice on how this can be achieved?

Aucun commentaire:

Enregistrer un commentaire