【问题标题】:Sorting MySQL fields in different order on different sites在不同站点上以不同顺序对 MySQL 字段进行排序
【发布时间】:2014-04-03 11:40:56
【问题描述】:

假设我有一个名为“Fruits”的表,在该表中有一个名为“Fruit”的行,其中包含六个条目:Apple、Banana、Kiwi、Orange、Peach、Tangerine。

我有四个网站想要以不同的方式对 SELECT * FROM Fruits 的结果进行排序,但它们没有模式。 它们不是随机的,因为每个站点都会决定以不同的方式对它们进行排序。例如,一个站点可能是“Kiwi, Apple, Banana, Tangerine, Orange, Peach”,而下一个站点可能是“Banana, Kiwi, Apple, Peach, Tangerine, Orange”。

是否可以像这样在 MySQL 中对这些进行排序,记住将来可能会添加项目并且需要根据每个站点的突发奇想再次任意排序?或者有没有办法在它们被拉出后在 PHP 中对这些结果进行排序?

【问题讨论】:

  • 不,它们不是随机的。每个站点都需要一个与其他站点不同的指定顺序。
  • 我在你的问题中看不到任何模式!您只指定了 2 个订单示例
  • 我认为你可以使用 ORDER BY FIELD() 来处理 mysql,因为你知道每个站点的排序顺序。在此处查看文档dev.mysql.com/doc/refman/5.0/en/…
  • 有点取决于...我之前在数据库中使用了site 表来存储在同一系统上运行的不同站点的配置选项。然后你可以有一个像fruit_to_site 这样的表,其中包含fruit.id、site.id 和sort_order 索引——然后你可以按站点对水果进行分类。或者,如果站点在不同的代码上运行,但来自同一个数据库,您可以在应用程序级别进行排序。
  • @CD001 解决方案似乎可行

标签: php mysql


【解决方案1】:

一种可能的方法是设置所谓的“排序图” - 水果名称字符串,按照您希望它们显示的确切顺序排列项目。然后你就可以在FIND_IN_SET MySQL 函数中使用这个数组了:

$sortMap = 'Kiwi,Apple,Banana,Tangerine,Orange,Peach';

$query = >>>QUERY
   SELECT fruit_id, fruit_name
     FROM fruits
 ORDER BY FIND_IN_SET(fruit_name, '$sortMap');
QUERY;

// do something with the query

要更改顺序,只需根据每个站点设置$sortMap。

【讨论】:

  • 我喜欢这个想法...假设您可以在应用程序中为每个站点分配$sortMap。我以前从未考虑过使用FIND_IN_SET 进行排序。
  • 是的,实际上这看起来很适合我们的 site_config 选项。然后我可以在所有站点上运行相同的查询,只需要更新配置文件。干杯,我试试看。
【解决方案2】:

好的,这最终在这里工作得最好:

    SELECT `fruit` 
    FROM (`Fruit`) 
    ORDER BY FIELD(`fruit`, 'Tangerine','Banana','Apple', 'Orange', 'Peach', 'Kiwi') ASC

正如raina77ow 所建议的,我创建了一个排序映射来保存我想要注入到查询中的值。这被保存为我们可以为每个站点切换的配置值。谢谢指导!

【讨论】:

    【解决方案3】:

    试试这个:

     SELECT * FROM Fruits ORDER BY rand()
    
    • 这会给你一个随机的结果集顺序!

    【讨论】:

    • 请再次阅读问题。 OP 说过 它们不是随机的。
    【解决方案4】:

    您需要为每个值分配某种站点订单标识符,或者至少在逻辑上使用fruit_type 字段对它们进行分组。否则你可以使用

    SELECT ... IF(fruit = 'apple',1,0) as fruit_apple ... ORDER BY ... fruit_apple
    

    这是一个非常不雅的解决方案。

    您是否考虑过对表格进行规范化,将苹果和订单移至单独的表格,然后根据要求加入?

    【讨论】:

    • 实际上它们是办公室,每个办公室都有自己的网站。 “办公室”表中有 12 个办公室,其中包含他们的所有信息。它们将始终显示在顶部的“self”办公室,然后顺序是任意的(我按字母顺序排列,但这不起作用)。所以我想一个名为“ordering”的表可以使用“office_id”作为外键。
    • 如果您可以控制数据库,您可以将信息存储为 json 元数据,否则您可能正在查看类似 EAV 或 4 列表,其中引用了主要办公室的外键,其他办公室和命令。
    • 不知道为什么我的回答被否决了,请给出原因?
    【解决方案5】:

    使用 this 检索值 按 rand() 排序;

    【讨论】:

    • '不,它们不是随机的。每个站点都想要一个与其他站点不同的指定顺序'谁在不阅读问题的情况下支持这个?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    相关资源
    最近更新 更多