【问题标题】:mysql forcing a record to the topmysql强制记录到顶部
【发布时间】:2011-02-21 13:42:53
【问题描述】:

我正在从 course2011 表中获取参加课程的人员列表,查询正在运行,但客户要求我们让进行查询的人(他们登录到网站)出现在列表顶部.人们不会全天参加课程,因此我的查询中的日期。

这是我当前的查询:

select firstname, lastname, startdate, enddate, contactid, courseid, venueid from courses2011 where courseid = '4' 
and ((enddate > '2011-05-01') AND (startdate < '2011-05-20'))"

假设联系人 ID“12345”已登录到该站点 - 我如何进行查询,以便它们出现在列表中的首位。

【问题讨论】:

  • 嵌入结果的 html 代码会有帮助
  • 如果你真的有一个名为 xxxx2011 的表...你需要重新考虑你的数据模型。

标签: sql mysql database join


【解决方案1】:

使用ORDER BY 子句:

SELECT [...]
ORDER BY CASE WHEN contactid = '12345' THEN 1 ELSE 0 END DESC

当然,您可以在ORDER BY 子句中添加额外的ORDER BY 字段。当然,您可以从会话表中读取'12345',或者使用绑定变量或您使用的任何方式来识别已登录的联系人。

【讨论】:

    【解决方案2】:

    一种选择是通过以下条件添加订单:

    ORDER BY IF(contactid = "12345",0,1)
    

    【讨论】:

    • 我很感动,你们很聪明。奇怪的是,客户希望顶部的人然后在注册日期之前订购。我现在确切地知道如何通过向 order by 添加第二个条件来做到这一点。无论如何,感谢您抽出宝贵时间回复。
    【解决方案3】:

    在 SO 上有一个类似的查询。看看this 是否能解决您的问题。

    【讨论】:

      【解决方案4】:
      ORDER BY contactid = 12345 DESC
      

      【讨论】:

        【解决方案5】:
        ORDER BY FIELD(contactid,12345) DESC
        

        【讨论】:

          【解决方案6】:

          你可以使用UNION,像这样:

          SELECT firstname, lastname, startdate, enddate, contactid, courseid, venueid
          FROM courses2011
          WHERE contactid = 12345
          
          UNION
          
          SELECT firstname, lastname, startdate, enddate, contactid, courseid, venueid
          FROM courses2011
          WHERE contactid <> 12345
            AND courseid = '4'
            AND ((enddate > '2011-05-01') AND (startdate < '2011-05-20'))
          ;
          

          【讨论】:

          • 这不能保证有效,因为UNION 运算符不需要保持元组的顺序。您必须订购整个工会
          • Union 也很慢,因为它会强制“区分”并且您将在 course2011 上通过两次。
          猜你喜欢
          • 1970-01-01
          • 2014-02-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多