订单,组和搜索查询。选择太多了

时间:2014-09-08 14:21:08

标签: mysql sql query-optimization

我正在运行此查询,女巫由3个递归选择组成。

select idigorUserFields 
from ( select * 
       from ( select * 
              from igorUserFields f
              where f.idigorUsers = 1
              order by f.idigorUserFields desc) tbl
       group by tbl.idigorUserFieldTemplates ) tbl2
where value="qf" and idigorUserFields = 28

我想做的很简单:

  • 获取所有字段,按插入日期排序(我使用的是主键)

  • 获取字段的最后插入值(idigorFieldTemplates)

  • 将最后插入的字段与我要插入的字段进行比较,以节省数据库上的空间

一些相关信息:

  • idigorUserFieldTemplates是“html用户字段表”的主键

  • 最后插入的值是程序

  • 上显示的值

另外,我有sqlfiddle!用一些数据来测试。

我的问题是:我可以更好地进行此查询吗?我需要用什么来做到这一点。

2 个答案:

答案 0 :(得分:0)

如果你想要的只是特定数据的最大id,只需指定它的顺序并限制它如此

SELECT idigorUserFields 
FROM igorUserFields 
WHERE idigorUsers = 1 AND value="qf"
ORDER BY idigorUserFields DESC
LIMIT 1

DEMO

如果你想获得最后一个插入的值,那么你可以得到最大的idigorUserFields,假设它自动递增。

SELECT MAX(idigorUserFields) FROM idigorUserFields

然后如果您想要该字段中的特定列,则可以将其用作子查询

SELECT f.idigorUserFieldTemplates 
FROM idigorUserFields f
WHERE f.idigorUserFields = 
(   SELECT MAX(idigorUserFields) 
    FROM idigorUserFields
    WHERE idigorUsers = 1 AND value="qf"
)

答案 1 :(得分:0)

好吧所以看起来你想获得给定用户和值的最后一个插入值,然后将它与你要插入的数据进行比较。以下是我将如何处理

SELECT a.idigorUserFieldTemplates
FROM igorUserFields AS a
INNER JOIN (SELECT MAX(idigorUserFields) as max_id FROM igorUserFields WHERE idigorUsers = 1 AND value="qf") AS b
ON a.idigorUserFields= b.max_id 

子查询给了我最大的idigorUserFields,idigorUsers = 1 AND value =“qf”。为此,您必须假设主键(idigorUserFields)随日期递增。你在帖子中表明它确实如此,所以希望这个假设是可以的。

一旦我们获得了最后更新的记录,我们就会与igorUserFields联接以获取idigorUserFieldTemplates的相应值

编辑: 我想为给定的用户和字段插入最后一个。然后将它与我即将插入的内容进行比较。 如果我对自己想要的东西不够清楚,我很抱歉。 我修改了上面的sql,我得到了我想要的东西:

SELECT a.* FROM igorUserFields
AS a INNER JOIN 
(SELECT MAX(idigorUserFields) as max_id
FROM igorUserFields WHERE idigorUsers = 1 and idigorUserFieldTemplates =6) AS b 
ON a.idigorUserFields= b.max_id
AND value="qf"

谢谢!现在我得到了一个更有效的解决方案:)