代码之家  ›  专栏  ›  技术社区  ›  mauriciopastrana

如何在MySQL中连接整个结果集?

  •  20
  • mauriciopastrana  · 技术社区  · 16 年前

    我正在尝试以下查询:

    SELECT A,B,C FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C FROM table WHERE field LIKE '%query%'
    GROUP BY B ORDER BY B ASC LIMIT 5
    

    这三个问题粘在一起,有点像。但是,返回的结果集反映了查询3的结果,而查询1的结果是不需要的。

    是否有任何方法可以对这些结果进行优先级排序,以便所有结果都是查询1的结果,然后所有结果都是查询2的结果,然后所有结果都是查询3的结果?我还不想在PHP中这样做(更不用说必须控制第一个查询中显示的结果,而不是第二个查询中显示的结果,以此类推)。

    7 回复  |  直到 6 年前
        1
  •  16
  •   Mario Marinato    16 年前

    也许您应该尝试包括第四列,说明它来自的表,然后按它排序和分组:

    SELECT A,B,C, "query 1" as origin FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C, "query 2" as origin FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C, "query 3" as origin FROM table WHERE field LIKE '%query%'
    GROUP BY origin, B ORDER BY origin, B ASC LIMIT 5
    
        2
  •  7
  •   Yaakov Ellis NevilleDNZ    16 年前

    添加一个具有硬编码值的附加列,用于对整体结果集进行排序,如下所示:

    SELECT A,B,C,1 as [order] FROM table WHERE field LIKE 'query%'
    UNION
    SELECT A,B,C,2 as [order] FROM table WHERE field LIKE '%query'
    UNION
    SELECT A,B,C,3 as [order] FROM table WHERE field LIKE '%query%'
    GROUP BY B ORDER BY [order] ASC, B ASC LIMIT 5
    
        3
  •  2
  •   Valerian Pereira    6 年前

    你能把它当作一个选择集来做吗?

    SELECT * FROM (
        SELECT A,B,C FROM table WHERE field LIKE 'query%'
        UNION
        SELECT A,B,C FROM table WHERE field LIKE '%query'
        UNION
        SELECT A,B,C FROM table WHERE field LIKE '%query%'
    ) ORDER BY B ASC LIMIT 5
    
        4
  •  1
  •   svrist    16 年前

    从中选择不同的A、B、C( 从表中选择a、b、c、1作为o,其中字段如“query%” 联合 从表中选择a、b、c、2作为o,其中字段类似于“%query” 联合 从表中选择a、b、c、3作为o,其中字段如“%query%” ) 按o asc限制5排序

    会是我的方式。我不知道那是怎么回事。

    我不明白

    GROUP BY B ORDER BY B ASC LIMIT 5
    

    它是否只适用于联盟中的最后一个选择?

    MySQL是否允许您按列分组,但仍然不在其他列上进行聚合?

    编辑:AAHAH。我看到MySQL确实做到了。它是一个独特的(b)或其他东西的特殊版本。我不想成为这方面的专家。

        5
  •  0
  •   Greg Hurlman    16 年前

    如果没有一种排序方法可以让您对它们进行排序,那么就不要将结果合并在一起——只需返回3个单独的记录集,并在数据层中相应地处理它们。

        6
  •  0
  •   Rais Alam    12 年前

    我最终(看了所有的建议)找到了这个解决方案,它在我需要的和时间之间做了一点妥协。

    SELECT * FROM 
      (SELECT A, B, C, "1" FROM table WHERE B LIKE 'query%' LIMIT 3
       UNION
       SELECT A, B, C, "2" FROM table WHERE B LIKE '%query%' LIMIT 5)
    AS RS
    GROUP BY B
    ORDER BY 1 DESC
    

    它总共提供了5个结果,从第四个“列”开始排序,并给出了我需要的结果;一个自然结果集(它将在Ajax上出现),以及一个通配符结果集紧随其后。

    :)

    /MP

        7
  •  0
  •   Adrian Cid Almaguer Abhishek    10 年前

    联合有两个变量。

    'UNION' and 'UNION ALL'
    

    在大多数情况下,你真正想说的是联合,因为它不做重复消除(想想 SELECT DISTINCT )在两个集合之间,可以节省相当多的执行时间。

    其他人建议多个结果集,这是一个可行的解决方案,但是我要注意,在时间敏感的应用程序或通过WAN连接的应用程序中,这样做可能会导致服务器和客户机之间的线路出现更多的往返。