【问题标题】:ORDER BY FIELD clause at the end of complicated mysql query with more than one UNION clouse具有多个 UNION clouse 的复杂 mysql 查询末尾的 ORDER BY FIELD 子句
【发布时间】:2015-01-30 09:42:50
【问题描述】:

我已经仔细阅读了这个: How to use ORDER BY inside UNION

尽管如此,ORDER BY 子句不适用于这个复杂的查询:

SELECT *, 'tbl' as src   FROM
(

SELECT name3, prec3, name6, prec6  
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6  
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 != '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 != '999' 
    AND (name6 REGEXP 'Shabla|Kaliakra|Varna' )      
    GROUP BY name3

UNION

SELECT name3, prec3, name6, prec6  
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 != '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 = '999' 
    AND (name3 REGEXP 'Shabla|Kaliakra|Varna')      
    GROUP BY name3

UNION

    SELECT name3, prec3, name6, prec6 
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 = '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 != '999' 
AND (name6 REGEXP 'Shabla|Kaliakra|Varna')      
   GROUP BY name6
) tbl


UNION


SELECT *, 'tbl' as src   FROM
(

SELECT name3, prec3, name6, prec6    
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 != '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 != '999' 
    AND (name6 REGEXP 'N.selo|Vidin|Vratca')   GROUP BY name3

UNION

SELECT name3, prec3, name6, prec6  
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 != '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 = '999' 
    AND (name3 REGEXP 'N.selo|Vidin|Vratca')      
GROUP BY name6

UNION

SELECT name3, prec3, name6, prec6   
FROM `prec3_2015` p3
    JOIN `prec6_2015` p6
    ON p3.m_d_t = p6.m_d_t AND name3 = name6
WHERE prec3 = '-' AND p3.time = 12 and p3.date = 24 and p3.month = 1 AND prec6 != '999' 
AND (name6 REGEXP 'N.selo|Vidin|Vratca')      
GROUP BY name6
) tbl

ORDER BY FIELD (src, 'Shabla|Kaliakra|Varna|N.selo|Vidin|Vratca')

这两个表几乎相同,有 7 列 - idmonthdatetimem_d_tname3prec3name6prec6第二张桌子。我不明白如何以查询末尾描述的方式订购结果? 提前谢谢你!

【问题讨论】:

    标签: mysql


    【解决方案1】:

    ORDER BY FIELD 应该是,

    ORDER BY FIELD (src, 'Shabla', 'Kaliakra', 'Varna', 'N.selo', 'Vidin', 'Vratca')
    

    您应该提供由, 分隔的值,而不是像带有| 的正则表达式

    参考:ORDER BY FIELD in specific order

    【讨论】:

    • 虽然这个关于ORDER BY FIELD的评论完全正确,但不足以回答问题,因为问题中的查询总是在src列中选择'tbl'
    • @axiac :: 我们可以在 ORDER BY 中使用别名。在这里查看stackoverflow.com/questions/14109076/…
    • 虽然src 可以在order by 中使用,但主要问题中的示例不正确。 src 的值始终是 'tbl' 并且不能是 'Shabla', etc...
    • @SridharDD 阅读上面 Ravinder 的评论。我不是说同样的话吗?你的答案是正确的,没有关于srcORDER BY FIELD() 的问题。但是原始查询永远不会在src 中返回'Shabla'。这就是为什么,在我们没有你的回答的情况下,它仍然没有达到他们的目标。
    【解决方案2】:

    试试这样的:

    SELECT name3, prec3, name6, prec6, name6 AS src  
    ...
    
    UNION
    
    SELECT name3, prec3, name6, prec6, name3 AS src  
    ...
    
    ...
    
    UNION
    
    SELECT name3, prec3, name6, prec6, name6 AS src  
    ...
    
    ORDER BY FIELD (src, 'Shabla', 'Kaliakra', 'Varna', 'N.selo', 'Vidin', 'Vratca')
    

    删除外部查询。

    在每个查询的SELECT 子句中添加一个新表达式X AS src,其中X123 等等,每个查询都有一个不同的值。

    最后一个查询之后的ORDER BY 子句适用于UNION 级别;没有必要使用括号。但是,如果您想让它更清楚,您可以将每个查询括在括号中,并将 UNIONs 和 ORDER BY 留在括号外。

    您将获得第一个 SELECT 返回的行,然后是第二个 SELECT 返回的行,依此类推。但是,每个选择返回的行没有特定的顺序(这就是您需要它们的样子)。

    【讨论】:

    • 我更正了“ORDER BY”子句中的分隔符,这是愚蠢的复制/粘贴错误。删除了外部查询并在每个“SELECT”子句上放置了不同的别名——就像上面的建议一样,但结果是一样的。没有我希望的顺序。在那种查询的情况下可能没有办法做到这一点?
    • 哦,现在我明白了你想如何对它们进行排序,我修改了答案中的查询。将name6 AS srcname3 AS src(取决于每个表/SELECT 的哪个字段包含要排序的值)放在SELECT 子句中,并在`ORDER BY 子句中正确使用函数FIELD()
    • 是的!而已! name3 为 src,name6 为 src.. 谢谢,谢谢变马赫!问题解决了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2012-03-16
    • 2019-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    相关资源
    最近更新 更多