如何在 mySQL 中对动态生成的特定顺序进行排序?

Posted

技术标签:

【中文标题】如何在 mySQL 中对动态生成的特定顺序进行排序?【英文标题】:How do I sort into a dynamically generated specific order in mySQL? 【发布时间】:2009-05-25 01:55:20 【问题描述】:

我一直在为此绞尽脑汁,但没有取得任何进展。我不太擅长 SQL,所以我希望答案很简单,我只是不知道。

我有 2 个表:一个名为“images”的表包含我想要的数据,用主键“imageID”组织。另一个称为“productPhotos”,它包含两个字段(加上一个主键):imageID 和 productID。因此,对于给定的产品,可能有多个图像,并且给定的图像可能用于表示多个产品。

到目前为止,它运行良好,但问题来了。我有一个动态生成的产品 ID 列表,我想加载代表这些产品的所有图像。而且我不仅要加载它们,还希望它们按照我列表中产品的顺序。

如果我的产品列表是“5,2,4”,我希望我的输出列表首先包含产品 5 的所有图像,然后是产品 2 的所有图像,然后是产品 4 的所有图像。我并不特别关心子组内的顺序。

获取正确的图像非常简单,但是以正确的顺序获取它们是可恶的。我想出了如何以正确的顺序获取我想要的图像的 ID,但实际上在没有单独的 mysql 调用的情况下获取这些图像到目前为止让我感到困惑。我尝试设置一个临时表,将我想要的 ID 存储在 @variable 中,以及 ORDER BY FIELD() 和 ORDER BY FIND_IN_SET() 的许多不同变体。

这是我目前得到的: SELECT imageID FROM productPhotos WHERE productID IN (5,2,4) ORDER BY FIELD(specificProductUID, 5,2,4);

这成功地以正确的顺序返回了一组 imageID,但我一直无法从那里从图像表中提取这些 imageID 的数据。我知道只需在 php 中使用两个单独的数据库调用(一个用于获取 imageID,另一个用于加载图像),我就可以很容易地做到这一点,但是(我认为)这意味着性能方面的巨大打击,而且看起来就像应该有更好的方法。

提前感谢您的帮助。

【问题讨论】:

【参考方案1】:
SELECT images.*
FROM images
INNER JOIN productPhotos ON images.imageID = productPhotos.imageID
WHERE productID in (5, 2, 4)
ORDER BY FIELD(specificProductUID, 5,2,4);

【讨论】:

它就像一个美丽的梦!这就是 JOIN 的工作原理。非常感谢您的帮助。 不客气!这是一个最常用的 JOIN 习惯用法——有效地将两个表“捆绑”在一起进行查询,基于一个具有对另一个主键的外键引用(不管 MySQL [w/myISAM] 不会强制引用这种情况下的完整性,它们仍然是外键;-)。 JOIN 还有许多其他用途,但这绝对是最重要和最受欢迎的一种。 我只是注意到这里有一个小小的遗漏。除非我弄错了,否则它需要阅读“SELECT images.*, productPhotos.specificProductUID FROM images...”,否则 ORDER BY FIELD 没有可处理的 specificProductUID。 @Robert,WHERE 和 ORDER BY 可以使用 SELECT 子句中未提及的列。

以上是关于如何在 mySQL 中对动态生成的特定顺序进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python按特定顺序对文件名进行排序

在 MySQL 中对 varchar 字段进行数字排序

如何在 MySQL 中对 concat_ws(',',collect_list(a)) 进行排序?

在 Gradle 任务中对属性文件的内容进行排序

如何对mySQL数据库中某些特定字段进行排序?

如何在 Hive 中对文件进行重复数据删除并保持原始排序顺序?