当产品未链接到类别时,SQL 按类别订购产品不起作用
Posted
技术标签:
【中文标题】当产品未链接到类别时,SQL 按类别订购产品不起作用【英文标题】:SQL Ordering products by category order not working when product is not linked to a category 【发布时间】:2014-03-04 19:41:30 【问题描述】:我有两个表,类别和产品。我正在尝试执行一个 select 语句,该语句将从产品中取出所有产品并使用类别表中的 order 列对其进行订购。
Categories
+--------+-------+-------+
| cat_id | name | order |
+--------+-------+-------+
| 1 | Cat 1 | 1 |
| 2 | Cat 2 | 3 |
| 3 | Cat 2 | 2 |
+--------+-------+-------+
Products
+---------+--------+-------+--------+
| prod_id | name | price | cat_id |
+---------+--------+-------+--------+
| 1 | Prod 1 | 1.99 | 1 |
| 2 | Prod 2 | 2.99 | 2 |
| 3 | Prod 3 | 3.99 | 3 |
| 4 | Prod 4 | 4.99 | 0 |
| 5 | Prod 5 | 4.99 | 2 |
+---------+--------+-------+--------+
我设法构建了这个 SQL 语句来完成它。
SELECT p.* FROM products AS p
JOIN categories AS c
ON c.cat_id = i.cat_id
ORDER BY c.order ASC
问题是产品不必属于某个类别,如果不是,此查询将不会检索它们。虽然我可以在没有连接的情况下执行第二个查询并附加到第一个查询,但当我开始为产品设置分页时肯定会出现问题,因为我认为计算要显示的产品会变得太复杂。有什么我可以做的吗?
【问题讨论】:
使用LEFT OUTER JOIN
而不是JOIN
See Fiddle Demo
当调用一个简单的JOIN
时,您是在告诉您的RDBMS 执行一个implicit JOIN
,它告诉mysql hey idk what I want so please guess at what I explicitly want
MySQL 响应哪个No problemo, INNER JOIN it is!
【参考方案1】:
您需要决定如何订购它们。
SELECT p.*
FROM products p LEFT JOIN
categories AS c
ON c.cat_id = i.cat_id
ORDER BY c.`order` ASC;
MySQL 恰好将NULL
值按升序排列在首位。你可能希望他们最后。所以改为这样做
SELECT p.*
FROM products p LEFT JOIN
categories AS c
ON c.cat_id = i.cat_id
ORDER BY (c.`order` is not null) DESC,
c.`order` ASC;
(c.order is not null)
表达式在定义 order
时计算为 0
,在未定义时计算为 1
。
而且,order
是一个非常糟糕的列名称,因为它是 MySQL 保留字(实际上,它在所有数据库中都是保留的)。您可以考虑使用 priority
之类的东西。
【讨论】:
我必须在(c.order is not null)
的末尾添加一个DESC
才能让它把没有类别的产品放在最后,但否则就可以了。以上是关于当产品未链接到类别时,SQL 按类别订购产品不起作用的主要内容,如果未能解决你的问题,请参考以下文章