Mysql 替换为按子查询排序
例如,从位于的数据库中(单击“运行SQL”),我想在所有来自美国的客户列表中,首先列出拥有大于80的最大CustomerID的客户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; 但这不是我使用
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很有道理。我希望能澄清我的问题,但这并不能回答问题。问题是关于使用筛选器列出,并将其插入另一个查询中。这并不能回答问题。问题是如何使用过滤器列出,并将其插入另一个查询中。