从另一张表中排序MYSQL订单

5

我有一个问题。

这里有两个表格

表格1:产品

product_id , name , images_sideview

表2: 产品描述

product_id , volgnr

我希望能按照表2中的数字和volgnr字段对它们进行排序。

是否有使用mysql实现此功能的方法?

3个回答

14

有两种排序方式:升序和降序。您没有提及排序方式。因此,我将为您提供这两个答案,每个答案都有两种变体:

升序:

SELECT DISTINCT table1.*
FROM table1
INNER JOIN table2 ON table1.product_id = table2.product_id
GROUP BY table1.product_id
ORDER BY table2.product_id ASC, table2.volgnr ASC;

降序排列:

SELECT DISTINCT table1.*
FROM table1
INNER JOIN table2 ON table1.product_id = table2.product_id
GROUP BY table1.product_id
ORDER BY table2.product_id DESC, table2.volgnr DESC;
如果你想告诉MySQL首先按volgnr排序,然后按product_id排序:

升序排列:

SELECT DISTINCT table1.*
FROM table1
INNER JOIN table2 ON table1.product_id = table2.product_id
GROUP BY table1.product_id
ORDER BY table2.volgnr ASC, table2.product_id ASC;

降序排列:

SELECT DISTINCT table1.*
FROM table1
INNER JOIN table2 ON table1.product_id = table2.product_id
GROUP BY table1.product_id
ORDER BY table2.volgnr DESC, table2.product_id DESC;
希望能帮到你。
编辑1: 我已经编辑了查询,以便它不会在结果中给你重复项。试一试,告诉我怎么样。
编辑2: 加了Group By子句。试试这个。

这也可以,但是它再次给我重复的产品,我得到每个产品三次。 - Jeffrey Lang
不要只使用SELECT *,而是使用SELECT DISTINCT *,这样应该就可以解决了。 - Devner
我已经使用了SELECT DISTINCT products.*,从products表和product_descriptions表做了内连接(INNER JOIN),并且按照product_descriptions.product_id升序(ASC)和product_descriptions.volgnr升序(ASC)的顺序进行排序。非常感谢@devner,它运行得非常好。 - Jeffrey Lang
使用内连接而不是左连接有什么原因或固有优势吗?这样做不会消除对group by/distinct的需求吗? - Chaosxmk
1
@Chaosxmk 我使用INNER JOIN,因为我只想看到两个表中都存在的条目。使用LEFT JOIN会将左表中的所有值带出来,无论它是否在右表中有匹配的条目。在我看来,GROUP BY / DISTINCT 不应该是你选择使用特定类型JOIN的标准。你只需要过滤数据,因此使用GROUP BY / DISTINCT。回答你的问题,使用INNER、LEFT或RIGHT join仅取决于你获取数据的需求。 - Devner
显示剩余2条评论

1
select *
from products t1
inner join product_descriptions t2 on t1.product_id = t2.product_id
order by t2.volgnr

1
星号会出错吗,因为product_id在两个表格中都存在? - trembon
@trembon 不,* 不会导致错误。仅引用“product_id”将导致错误。同样,如果您有两个具有相同名称的列,一个在每个表中,则只会从 t2 中获取结果。但是,如果 Table2 中对于每个 product_id 存在多行,则可能返回比您想要的更多的结果。您可能需要执行类似 SELECT DISTINCT t1.product_id,t1.name FROM... 或者如果您想要 volgnr 值,则可能需要使用 GROUP BY 和 GROUP_CONCAT。 - liquorvicar
@trembon,不,SELECT * 中的重复列名不会出错。MySQL 不需要区分它们,因为你没有对它们进行任何操作。 - Marcus Adams
现在我已经选择了DISTINCT * 从产品t1 内连接产品描述t2 on t1.product_id = t2.product_id 按t2.volgnr排序 但仍然给我重复的项。 - Jeffrey Lang
我已经使用了@Devner的解决方案,效果非常好。谢谢大家的支持,真的帮了我很多,我又学到了很多东西。 - Jeffrey Lang
显示剩余6条评论

0
SELECT p.'product_id', p.'name', p.'images_sideview' 
FROM products p 
LEFT JOIN product_descriptions d ON p.product_id = d.product_id 
ORDER BY d.volgnr;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接