Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 替换为按子查询排序_Mysql_Subquery_Sql Order By - Fatal编程技术网

Mysql 替换为按子查询排序

Mysql 替换为按子查询排序,mysql,subquery,sql-order-by,Mysql,Subquery,Sql Order By,例如,从位于的数据库中(单击“运行SQL”),我想在所有来自美国的客户列表中,首先列出拥有大于80的最大CustomerID的客户 SELECT * FROM Customers WHERE Country = 'USA' ORDER BY CustomerID = (SELECT MAX(CustomerID) FROM Customers WHERE CustomerID > 80 AND Country = 'USA') DESC, PostalCode; 但这不是我使用

例如,从位于的数据库中(单击“运行SQL”),我想在所有来自美国的客户列表中,首先列出拥有大于80的最大CustomerID的客户

SELECT * FROM Customers
WHERE Country = 'USA'
ORDER BY CustomerID = (SELECT MAX(CustomerID) FROM Customers 
    WHERE CustomerID > 80 AND Country = 'USA') DESC, PostalCode;
但这不是我使用的真正的查询。如果选择。。。从…起哪里查询部分更复杂,什么是更优雅的查询

我试图修改的实际查询是

SELECT post.postid, post.visible, post.userid, post.parentid, post.vote_count
FROM " . TABLE_PREFIX . "post AS post
WHERE post.threadid = $threadid
AND post.visible IN (1" . (!empty($deljoin) ? ", 2" : "") . 
    ($show['approvepost'] ? ", 0" : "") . ")
ORDER BY post.postid = {$threadinfo['firstpostid']} DESC, post.vote_count > 5 DESC, 
    post.dateline $postorder
其中,
post.vote\u count>5 DESC
部分我试图仅替换为大于5的最大post.vote\u count。因此,我使用:

SELECT post.postid, post.visible, post.userid, post.parentid, post.vote_count
FROM " . TABLE_PREFIX . "post AS post
WHERE post.threadid = $threadid
AND post.visible IN (1" . (!empty($deljoin) ? ", 2" : "") . 
    ($show['approvepost'] ? ", 0" : "") . ")
ORDER BY post.postid = {$threadinfo['firstpostid']} DESC, post.vote_count = (
    SELECT MAX(post.vote_count)
    FROM " . TABLE_PREFIX . "post AS post
    WHERE post.threadid = $threadid
    AND post.visible IN (1" . (!empty($deljoin) ? ", 2" : "") . 
        ($show['approvepost'] ? ", 0" : "") . ")
    AND post.vote_count > 5
)
DESC, post.dateline $postorder
一切都很好。但您可以想象一个更复杂的查询,可能是带有内部联接的查询,它的SELECT。。。从…起哪里等必须在子查询中全部重复


因此,我的问题是,我想,您是否可以对查询结果进行排序,以便第一项(在这些结果中)具有字段的最大值,其余项按其他方式排序,而不必在子查询中重写整个查询?

此查询将按CustomerID的降序列出数据

 SELECT * FROM Customers
    WHERE Country = 'USA'
    ORDER BY CustomerID  DESC, PostalCode;

此查询将按CustomerID的降序列出数据

 SELECT * FROM Customers
    WHERE Country = 'USA'
    ORDER BY CustomerID  DESC, PostalCode;

MySQL不支持CTE,CTE是简化查询的完美解决方案。但是,可以通过视图模拟它们:

CREATE VIEW c AS (SELECT Customer.* FROM Customer WHERE Country = "USA");
SELECT c.* FROM c ORDER BY CustomerID = (SELECT MAX(CustomerID) FROM c) DESC;
DROP VIEW c;
在您的情况下,这将提供:

CREATE VIEW p AS (
    SELECT post.postid, post.visible, post.userid, post.parentid, post.vote_count
    FROM " . TABLE_PREFIX . "post AS post
    WHERE post.threadid = $threadid
    AND post.visible IN (1" . (!empty($deljoin) ? ", 2" : "") . 
        ($show['approvepost'] ? ", 0" : "") . ")
);
SELECT p.* FROM p
ORDER BY p.postid = {$threadinfo['firstpostid']} DESC, p.vote_count = (
    SELECT MAX(p.vote_count)
    FROM p
    WHERE p.vote_count > 5
)
DESC, post.dateline $postorder;
DROP VIEW p;

MySQL不支持CTE,CTE是简化查询的完美解决方案。但是,可以通过视图模拟它们:

CREATE VIEW c AS (SELECT Customer.* FROM Customer WHERE Country = "USA");
SELECT c.* FROM c ORDER BY CustomerID = (SELECT MAX(CustomerID) FROM c) DESC;
DROP VIEW c;
在您的情况下,这将提供:

CREATE VIEW p AS (
    SELECT post.postid, post.visible, post.userid, post.parentid, post.vote_count
    FROM " . TABLE_PREFIX . "post AS post
    WHERE post.threadid = $threadid
    AND post.visible IN (1" . (!empty($deljoin) ? ", 2" : "") . 
        ($show['approvepost'] ? ", 0" : "") . ")
);
SELECT p.* FROM p
ORDER BY p.postid = {$threadinfo['firstpostid']} DESC, p.vote_count = (
    SELECT MAX(p.vote_count)
    FROM p
    WHERE p.vote_count > 5
)
DESC, post.dateline $postorder;
DROP VIEW p;

你的数据库有多大?查询并不太复杂,奇怪的是它需要很长时间。你能解释一下吗?@Benoit Garret很有道理。我希望能澄清我的问题。你的数据库有多大?查询并不太复杂,奇怪的是它需要很长时间。你能解释一下吗?@Benoit Garret很有道理。我希望能澄清我的问题,但这并不能回答问题。问题是关于使用筛选器列出,并将其插入另一个查询中。这并不能回答问题。问题是如何使用过滤器列出,并将其插入另一个查询中。