2013-06-28 25 views
-2

我尝试,因为作祟为了优化我的查询,为更多的理解, 我试图做到这一点很好的解决方案:Slow query when using ORDER BY这个mysql查询语法有什么问题?

我有70K在我的表,当我去为了这个,我有这个eeror:# 1248 - 每一个派生表必须有它自己的别名

我原来的查询是这样的:

SELECT * FROM 
(SELECT * FROM profile 
    LEFT JOIN profileg USING(id) 
    WHERE X NOT IN (SELECT A FROM B) AND (S = 1) 
    DESC LIMIT 0, 20 
) ORDER BY M 

你可以提供一些帮助吗?!? 问候, 杰西卡

+1

一般提示:如果你说你得到一个错误信息,**告诉我们它是什么**。至于你的查询,你不需要那些额外的括号。这种类型的包围仅在连接多个表时在sql server中需要。在MySQL中,它们不是必需的,反正你把它们放在错误的位置。 –

+0

'profile'是表格还是列?您可以从中进行选择,还可以将它用作WHERE和ORDER BY子句中的列。如果你有一个与表名相同的列,你应该改变它,或者至少使用一个表别名,这样它的可读性就更高。 –

+0

@ Marc,括号可以解决一些“orderby”pb的某些查询 – jess

回答

1

您的第二个查询中的错误是您的子查询无效。这是你以后的事吗?

SELECT * 
FROM (SELECT * FROM profile 
    LEFT JOIN profileg USING(id) 
    WHERE X NOT IN (SELECT A FROM B) AND S = 1 
    ) as table1 
ORDER BY M DESC 
LIMIT 0, 20 

虽然我没有看到子查询的要点。做

SELECT * FROM profile 
LEFT JOIN profileg USING(id) 
WHERE X NOT IN (SELECT A FROM B) AND S = 1 
ORDER BY M DESC 
LIMIT 0, 20 

似乎基本上是一样的事情,除非你正在执行少一个查询。

+0

但实际上它不一样,我有70K的行和oreder由于麻烦,我想(SELECT * FROM profile) LEFT JOIN profileg USING(id) WHERE X NOT IN(SELECT A FROM B)AND S(SELECT A FROM B)AND S = 1 ) ORDER BY M DESC LIMIT 0,20 – jess

+0

它不一样,我有70K行和顺序引起麻烦, – jess

+0

在我的回答中,第一个查询运行速度比第二个更快?他们都使用ORDER BY,就像你的两个例子一样。 –