【问题标题】:How do I Concatenate entire result sets in MySQL?如何在 MySQL 中连接整个结果集?
【发布时间】:2008-08-06 18:47:24
【问题描述】:

我正在尝试以下查询:

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

这三个查询粘在一起,有点像。但是,返回的结果集在查询 #1 的结果之前反映了查询 #3 的结果,这是不希望的。

有没有办法对这些进行优先级排序,以便查询#1 的结果全部出现,然后查询#2 的结果全部出现,然后查询#3 的结果全部出现?我还不想在 PHP 中执行此操作(更不用说必须控制在第一个查询中显示的结果不在第二个查询中显示等等)。

【问题讨论】:

    标签: mysql sql union


    【解决方案1】:

    也许您应该尝试添加第四列,说明它来自哪个表,然后按它排序和分组:

    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】:

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

      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】:

        你能把它作为一个子选择来做吗,比如

        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】:

          选择不同的 a,b,c FROM ( SELECT A,B,C,1 as o FROM table WHERE field LIKE 'query%' 联盟 SELECT A,B,C,2 as o FROM table WHERE field LIKE '%query' 联盟 SELECT A,B,C,3 as o FROM table WHERE field LIKE '%query%' ) ORDER BY o ASC LIMIT 5

          这将是我的做法。我不知道它是如何扩展的。

          我不明白

          GROUP BY B ORDER BY B ASC LIMIT 5
          

          它仅适用于联合中的最后一个 SELECT 吗?

          mysql 是否真的允许你按列分组,但仍然不能对其他列进行聚合?

          编辑:啊啊。我看到 mysql 确实如此。它是 DISTINCT(b) 或其他东西的特殊版本。我不想尝试成为该领域的专家:)

          【讨论】:

            【解决方案5】:

            如果没有一种有意义的排序方式来对它们进行排序,请不要将结果合并在一起 - 只需返回 3 个单独的记录集,并在您的数据层中相应地处理它们。

            【讨论】:

              【解决方案6】:

              我最终(查看了所有建议)得出了这个解决方案,它在我需要的东西和时间之间有点妥协。

              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】:

                UNION 有两种变体。

                'UNION' and 'UNION ALL'
                

                在大多数情况下,您真正​​想说的是 UNION ALL,因为它不会在集合之间进行重复消除(想想SELECT DISTINCT),这可以节省相当多的执行时间。

                其他人建议了多个结果集,这是一个可行的解决方案,但我会提醒在时间敏感的应用程序或通过 WAN 连接的应用程序中不要这样做,因为这样做会导致服务器和客户端之间的线路上的往返次数显着增加。

                【讨论】:

                  【解决方案8】:

                  我不明白为什么需要联合从单个表中获取数据

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

                  【讨论】:

                    猜你喜欢
                    • 1970-01-01
                    • 1970-01-01
                    • 2010-12-16
                    • 2011-11-23
                    • 1970-01-01
                    • 2018-02-14
                    • 1970-01-01
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多