【问题标题】:Search table in 2 fields show first result first2 个字段中的搜索表首先显示第一个结果
【发布时间】:2016-01-19 17:21:32
【问题描述】:

我有一个名为 Photos 的表(Id、Title、Description、Date、Online)。 我想按标题和描述搜索表格,但我想先查看标题搜索的结果,然后再查看描述的结果。

我尝试了正常搜索,但不知道如何将它们分开。

SELECT * FROM [Photos] 
WHERE ([Online] = 1) 
AND ([Description] like '%" + querytext + "%') 
OR ([Title] like '%" + querytext + "%') 
ORDER BY [Date] DESC, [Id] DESC

然后我尝试用 UNION 来做,但也没有用。

SELECT * FROM [Photos] 
WHERE ([Online] = 1) 
AND ([Description] like '%" + querytext + "%') 
UNION 
SELECT * FROM [Photos] 
WHERE ([Online] = 1) 
AND ([Title] like '%" + querytext+ "%') 
ORDER BY [Date] DESC, [Id] DESCBeto

【问题讨论】:

    标签: sql union


    【解决方案1】:

    添加一些将标记行的列:

    SELECT *, 1 AS Mark 
    FROM [Photos] 
    WHERE ([Online] = 1) 
    AND ([Title] like '%" + querytext + "%') 
    UNION ALL
    SELECT *, 2 AS Mark 
    FROM [Photos] 
    WHERE ([Online] = 1) 
    AND ([Description] like '%" + querytext+ "%') 
    ORDER BY Mark, [Date] DESC, [Id] DESC
    

    【讨论】:

    • 难道你也需要按 Mark 订购吗?
    • 是的,您不需要将两者都放在子查询中吗?
    • @Fred,你当然需要。感谢您发现这一点。
    • @JuanCarlosOropeza,它可以在不输入子查询的情况下工作
    • 它重复在标题和描述中都有查询文本的记录。试图从 UNION ALL 中删除 ALL,但没有任何区别。
    【解决方案2】:

    只需在您的UNION 中包含一个source 字段,将结果放入子查询中并对子查询进行排序。

    SELECT *
    FROM (
        SELECT 'Description' as source, * FROM [Photos] 
        WHERE ([Online] = 1) 
        AND ([Description] like '%" + querytext + "%') 
        UNION 
        SELECT 'Title' as source, * FROM [Photos] 
        WHERE ([Online] = 1) 
        AND ([Title] like '%" + querytext+ "%') 
        ) T
    ORDER BY source DESC, [Date] DESC, [Id] DESC
    

    【讨论】:

    • 复制标题和描述上都有查询文本的记录。
    • @Kamran Farzami 的最新更新呢?看起来是在正确的轨道上
    • @Humberto 你能分享示例数据和预期输出吗?
    【解决方案3】:

    您可以在ORDER BY 子句中使用CASE 表达式:

    SELECT *
    FROM Photos 
    WHERE
      Online = 1 
      AND Description like '%" + querytext + "%'
      OR Title like '%" + querytext + "%'
    ORDER BY
      CASE WHEN Title like '%" + querytext + "%' THEN 1 ELSE 2 END,
      [Date] DESC,
      [Id] DESC
    

    【讨论】:

      【解决方案4】:
      SELECT *
      FROM (
          SELECT 'Description' as source, * FROM [Photos] 
          WHERE ([Online] = 1) 
          AND ([Description] like '%" + querytext + "%') 
          UNION 
          SELECT 'Title' as title, * FROM [Photos] 
          WHERE ([Online] = 1) 
          AND ([Title] like '%" + querytext+ "%') 
          ) T
      ORDER BY title DESC, [Date] DESC, [Id] DESC
      

      【讨论】:

        【解决方案5】:

        试试这个:

        SELECT * FROM [Photos] 
        WHERE ([Online] = 1) 
        AND (([Description] like '%" + querytext + "%') 
        OR ([Title] like '%" + querytext + "%')) 
        ORDER BY [Date] DESC, [Id] DESC
        

        这个怎么样:

        SELECT *, CASE WHEN ([Description] like '%" + querytext + "%') THEN 1 WHEN ([Title] like '%" + querytext + "%') THEN 2 END AS ord  FROM [Photos] 
        WHERE ([Online] = 1) 
        AND (([Description] like '%" + querytext + "%') 
        OR ([Title] like '%" + querytext + "%')) 
        ORDER BY [Date] DESC, [Id] DESC , ord DESC  
        

        【讨论】:

        • 它给了我与我的第一个代码相同的结果。我需要它首先出现在搜索结果中匹配的标题,然后是匹配的描述。
        • Kamran 你走在正确的道路上,但 filiprem 解决方案很简单。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        • 1970-01-01
        • 2022-01-06
        • 2012-05-18
        • 2014-04-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多