【问题标题】:Combining the data in two columns into one for sorting将两列中的数据合并为一列进行排序
【发布时间】:2012-01-20 13:55:23
【问题描述】:

我正在尝试 UNION SELECT 中的两列,并为第三列加上别名。

我还需要检索匹配 WHERE 子句的数据,然后按别名列 (MLS_SORT) 排序。

这个以及我尝试过的它的变体都不起作用。

SELECT *
FROM
(SELECT MLS_AGENT_ID AS MLS_SORT FROM mlsdata)

UNION

(SELECT MLS_OFFICE_ID AS MLS_SORT FROM mlsdata)

WHERE (MLS_AGENT_ID = $agent_narid) OR (MLS_OFFICE_ID = $office_narid)      

ORDER BY MLS_SORT

这部分确实有效,并使用正确的值创建了 MLS_SORT 别名,但我不知道如何将结果限制为上面的 WHERE 子句:

(SELECT MLS_AGENT_ID AS MLS_SORT FROM mlsdata)

UNION

(SELECT MLS_OFFICE_ID AS MLS_SORT FROM mlsdata)

我是否至少走上了正确的道路,或者这不是正确的继续方式?

感谢您的帮助。

【问题讨论】:

    标签: mysql select union


    【解决方案1】:

    诀窍在于理解UNION的语法:查询UNION查询

    我想你想要:

    SELECT MLS_SORT
    FROM
    (
        SELECT MLS_AGENT_ID AS MLS_SORT 
          FROM mlsdata
         WHERE MLS_AGENT_ID = $agent_narid
    
        UNION
    
        SELECT MLS_OFFICE_ID AS MLS_SORT 
          FROM mlsdata
         WHERE MLS_OFFICE_ID = $office_narid
    )
    ORDER BY MLS_SORT
    

    要将两个 ID 子集放入一个结果集中,然后对它们进行排序。

    但是,整个查询看起来将提供两行结果集——一行用于代理,另一行用于办公室。那是你要的吗?

    您的逻辑有效地将代理 ID 和办公室 ID 编号转换为单个结果集。这对您的应用有意义吗?

    【讨论】:

    • 感谢您的回复。我确实希望有一个派生列 MLS_SORT,它将包含代理 ID 和办公室 ID 的组合结果。表中不存在 MLS_SORT。基本上检索agent id = agent id或office id = office id的所有记录,将agent id和office id数据合并为一列,然后按该列排序。
    • 我试过你的代码但收到:mysql_num_rows(): 提供的参数不是有效的 MySQL 结果资源 ....和 ​​mysql_fetch_array(): 提供的参数不是有效的 MySQL 结果资源...尝试将 MLS_SORT 更改为 *,结果相同。
    • 我认为 $agent_narid 和 $office_narid 项目会被您用来编写发出查询的代码的任何语言所取代(PHP?您没有提到它)。您收到的消息来自该语言,而不是来自 mySQL 服务器。您可以尝试使用常量来代替那些 $variable 项进行调试。一旦成功,您就可以进行替换。
    • 是的,PHP,对不起!我会试一试的。谢谢!
    【解决方案2】:

    试试这样的:

        select * from
        (
        (SELECT MLS_AGENT_ID AS MLS_SORT 
         FROM mlsdata
         WHERE (MLS_AGENT_ID = $agent_narid)
         )
        UNION
        (SELECT MLS_OFFICE_ID AS MLS_SORT 
         FROM mlsdata
         WHERE (MLS_OFFICE_ID = $office_narid)
         )) a
        ORDER BY MLS_SORT
    

    编辑

    交替顺序

    ORDER BY 1
    

    【讨论】:

    • 嗨兰迪,使用你的例子,(在 union 之后添加 ALL 以获得所有 11 个结果),我得到了 MLS_SORT 列的正确结果。办公室和代理 ID 相结合。但是,即使使用了 *,也不会检索到其他数据。
    • 即使检索到的行数为 11,但只有 MLS_SORT 列有数据...如果我将 * 更改为任何其他列名(存在),我得到:警告:mysql_num_rows() : 提供的参数不是有效的 MySQL 结果资源...有什么想法吗?
    • 您的 order by 必须包含子选择中的一个名称...您可以尝试使用 '1' 代替以指示第一列的 order...
    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2019-01-11
    相关资源
    最近更新 更多