MariaDB输出的问题

时间:2018-10-31 14:19:14

标签: php sql left-join mariadb inner-join

我正在尝试基于MariaDB表创建菜单。 我们有一个关联表,可以与其他表连接

#ass_products_categories
product_id | category_id
-------------------------
1          | 1    <- GENDER
1          | 3    <- AGE
1          | 16   <- TYPE
2          | 2
2          | 3
2          | 16
3          | 2
3          | 4
3          | 17
4          | 1
4          | 2
4          | 3
4          | 16

显然,列引用了产品表和类别表

#products
id | name          | qty | is_published
---------------------------------------
1  | T-Shirt Black | 10  | 1
2  | Long Dress    | 0   | 1
3  | T-Shirt Blue  | 10  | 0
4  | T-Shirt Red   | 10  | 1

#categories
id | name        | tipology_id
------------------------------
1  | Man         | 1 <- GENDER
2  | Woman       | 1 
3  | 3 a 5 years | 2 <- AGE
4  | 6 a 7 years | 2
16 | T-Shirt     | 4 <- TYPE
17 | Dress       | 4

这是我期望的输出。

[Man]
---- [3 A 5 years]
--------- T-Shirt

[Woman]
---- [6 a 7 years]
--------- T-Shirt
--------- Dress

我可以使用PHP和很多循环来做到这一点,但我知道只有通过良好的查询才能做到这一点。但是我确实陷入了很多左联接和内联接。

重点是:如果某个类别中没有发布任何产品,或者该类别中的所有产品的数量均为0,则该类别不应出现在菜单中。我找到的最接近的方法是WITH,但是在MariaDB中(至少在主机MariaDB服务器中)无法使用/

对不起,我的英语不好。 感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

这是一个非常复杂的操作,但仅用于联接查询的想法。 Check here

SELECT DISTINCT gender.name, 
                age.name, 
                type.name 
FROM   ass_products_categories a 
       JOIN products p
         ON p.id = a.product_id and is_published = 1
       JOIN (SELECT c.name, 
                    product_id 
             FROM   ass_products_categories pc 
                    JOIN categories c 
                      ON c.id = pc.category_id 
                         AND c.tipology_id = 1) gender 
         ON gender. product_id = a.product_id 
       JOIN (SELECT c.name, 
                    product_id 
             FROM   ass_products_categories pc 
                    JOIN categories c 
                      ON c.id = pc.category_id 
                         AND c.tipology_id = 2) age 
         ON age.product_id = a.product_id 
       JOIN (SELECT c.name, 
                    product_id 
             FROM   ass_products_categories pc 
                    JOIN categories c 
                      ON c.id = pc.category_id 
                         AND c.tipology_id = 4) type 
         ON type.product_id = a.product_id