【问题标题】:ordering search results from mysql从 mysql 排序搜索结果
【发布时间】:2013-12-18 15:17:03
【问题描述】:

我有一个包含项目的表,表中的 2 个属性是 name(项目名称)和 keywords(与该项目有关的词)。当我在数据库中搜索项目时,我使用以下代码。 我将搜索条目q="" 存储在变量$query 中。 我的mysql搜索如下..

    $q = "SELECT * FROM items WHERE name LIKE '%$query%' OR keywords LIKE '%$query%' AND status = '1'  LIMIT $start, $per_page";

此代码获取我的所有项目,其中项目名称类似于查询,或者它包含类似于查询的关键字.. 我如何对结果进行排序,以便名称类似于查询的项目出现在包含类似于查询的关键字的项目之前? 刚才它只是订购了首先添加到数据库中的项目。

【问题讨论】:

    标签: php mysql sql select sql-like


    【解决方案1】:

    你可以这样试试

    SELECT * 
      FROM items 
     WHERE (name LIKE '%$query%' 
        OR keywords LIKE '%$query%') 
       AND status = '1' 
     ORDER BY (name LIKE '%$query%') DESC, name, keywords
     LIMIT $start, $per_page
    

    附带说明:考虑使用prepared statements,而不是插入查询字符串。

    【讨论】:

      【解决方案2】:

      您可以使用 CASE 语句为OrderValue 赋值,然后按OrderValue 排序:

      SELECT *, 
        CASE WHEN name LIKE '%$query%' 
          THEN 1 
          ELSE 2 END AS OrderValue 
      FROM items 
      WHERE name LIKE '%$query%' 
        OR keywords LIKE '%$query%' 
        AND status = '1' 
      ORDER BY OrderValue 
      LIMIT $start, $per_page
      

      【讨论】:

        【解决方案3】:

        试试这样的:

        $q = 
        "SELECT * FROM items WHERE name LIKE '%$query%' AND status = '1'
         UNION
         SELECT * FROM items WHERE keywords LIKE '%$query%' AND status = '1'  
         LIMIT $start, $per_page"
        

        【讨论】:

          猜你喜欢
          • 2018-01-28
          • 2012-03-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-06
          • 1970-01-01
          相关资源
          最近更新 更多