【问题标题】:Problems with MariaDB outputMariaDB 输出的问题
【发布时间】:2019-04-04 17:58:02
【问题描述】:

我正在尝试创建一个基于 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 服务器中不可用)

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

【问题讨论】:

  • 考虑在应用程序代码中处理数据显示相关需求(例如:PHP)。
  • 您没有任何关于数据库层次结构的信息,因此您必须通过 PHP 创建它或查看您的表结构,但您仍然需要 PHP
  • 为什么是Man -&gt; 3A5years -&gt; T-Shirt 而不是T-Shirt -&gt; 3A5years -&gt; Man?您的表格中没有关于类别的级别的信息。他们都看着同一水平。不是吗?您的数据库建模似乎不完整。
  • 是的...我可以在 PHP 中处理它。但这意味着循环内有一些查询,这是一种不好的方法。我想知道只有一个好的查询就可以做到这一点。
  • 什么版本的 MySQL? 5.x 还是 8.x?好像是 5.x。

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


【解决方案1】:

这是一个非常复杂的操作,但只是为了连接查询的想法。 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 

【讨论】:

  • 这是我找到的最接近的。谢谢你。我将需要另一个查询来检查产品是否已发布/发布,或者更好地扩展此查询以一次性完成?
  • 您可以添加产品的内部连接来做到这一点并检查我更新的代码
  • 就是这样!太感谢你了。我永远不会单独解决这个问题。
猜你喜欢
  • 2018-04-12
  • 2016-04-04
  • 1970-01-01
  • 2023-03-10
  • 2017-01-02
  • 2019-01-28
  • 1970-01-01
  • 2015-10-11
  • 1970-01-01
相关资源
最近更新 更多