【问题标题】:How to order by a column if it exists for a table or order by another column if it doesn't如果表存在,如何按列排序,如果不存在,如何按另一列排序
【发布时间】:2022-07-05 23:49:40
【问题描述】:

我有一个通用函数 (php),它通过匹配列值来检索表的多条记录,并按日期时间字段对它们进行排序。在某些情况下,多条记录的日期时间是相同的,几乎在同一时间插入,并且在这些表上还有另一列是记录号,一个自动递增的数字。我想检查该表是否存在此记录号列,如果存在,请按其排序。否则,如果表中不存在记录号列,我想按日期时间字段排序。我可以编写一个单独的函数,对记录号进行排序,但更喜欢使用 mysql 解决方案由单个函数处理。

我只是想知道这是否可以做到?

使用 IF、Exist 还是 orderby?

【问题讨论】:

  • 欢迎,为了改善您在 SO 上的体验,请 take the tour 并阅读 how to askOn Topic question,然后查看 Question Check listperfect question 以及如何创建 @987654326 @
  • 您基本上是在要求我们设计,或者根据规范设计和编写代码。这不是 StackOverflow 的用途,我们互相帮助解决我们遇到的与代码相关的问题,我们不会为您编写代码
  • RiggsFolly,不。只是想知道如果表中不存在另一列,如何按一列排序。 mysql能做到吗?如果,存在,ORDERBY?
  • 不就是一行简单的Mysql代码吗?在这里要求不高。
  • 这不是一行简单的 Mysql 代码吗? 您是否尝试过您描述的这些选项?这听起来很简单

标签: php mysql


【解决方案1】:

作为一个非常宽泛的描述,您可以将 SQL 查询执行视为由多个单独的阶段组成:

  1. 解析查询:检查语法,找出哪些位是表名,字符串在哪里开始和结束,是 SELECT 还是 UPDATE,等等。这是 MySQL 获取 PHP 提供的字符串的地方将其分解为一些内部部分。
  2. 计划查询:确定涉及哪些表和列,需要如何过滤和操作它们,可以使用哪些索引和优化。剩下的唯一未知数是您用于 prevent SQL Injection 的数据的占位符。
  3. 执行查询:插入实际值,获取索引和数据,并运行计划的步骤以提供所需的输出或效果。这是使用您绑定到占位符的实际值的地方。

重点是第2步一般不处理“if”和“maybe”,它期望直接被告知“use this column, of this table”。使用什么表的任何选择都必须发生在之前任何东西击中数据库。

在您的情况下,这意味着表的选择发生在 PHP 中;但是PHP只是构建一个字符串,它不知道存在哪些列,所以它也不能自动做出这个决定。

简而言之,您需要编写一些自定义代码来执行此操作:列出哪些表使用哪个列进行排序;或对INFORMATION_SCHEMA.COLUMNS 等系统视图进行额外查询以查找它,然后在 PHP 中使用条件逻辑。

【讨论】:

  • 所以 mysql 不能做我想做的事,因为它不能处理表中没有列的“情况”。这可能就是为什么我很难找到答案并在这里提出问题的原因。如果做不到就这样吧。我将编写另一个函数来专门与这些表进行交互。
  • @callison 准确地说,CASE ... END 子句在我在这里称为“阶段 3”的情况下运行:它采用 ,并将它们插入计划的一组对一组特定的表和列进行操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多