2011-04-25 118 views
0

我想执行我的功能,下面,但我得到一个错误 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '/ (SELECT COUNT(1) FROM users WHERE registered_at BETWEEN '1293861600' AND '1303' at line 1")这个查询有什么问题?

基本上我试图用第二个SELECT语句来划分第一个SELECT语句。

cursor.execute("(SELECT COUNT(1) FROM users WHERE " 
        "  (registered_at BETWEEN '1293861600' AND '1303729537') " 
        "     AND user_id IN ( SELECT parent_id FROM files " 
        "          WHERE created_at > '1293861600'))/" 
        "(SELECT COUNT(1) FROM users " 
        "WHERE registered_at BETWEEN '1293861600' AND '1303729537') ") 

此外,有没有更好的方式来重新编写此查询?

回答

1
cursor.execute("SELECT COUNT(1) " 
       "/(SELECT COUNT(1) FROM users " 
       "  WHERE registered_at BETWEEN '1293861600' AND '1303729537') " 
       " FROM users " 
       " WHERE (registered_at BETWEEN '1293861600' AND '1303729537') " 
       " AND user_id IN (SELECT parent_id FROM files " 
       "     WHERE created_at > '1293861600') ") 

IN能化作JOIN

cursor.execute(" SELECT COUNT(DISTINCT users.user_id) " 
       "  /(SELECT COUNT(1) FROM users " 
       "   WHERE registered_at " 
       "    BETWEEN '1293861600' AND '1303729537') " 
       " FROM users " 
       " JOIN files " 
       "  ON files.parent_id = users.user_id " 
       " WHERE (users.registered_at BETWEEN '1293861600' AND '1303729537') " 
       " AND (files.created_at > '1293861600') " 
      ) 

查询也可以使用一个子查询重写,像这样:

cursor.execute(" SELECT SUM(IF(user_id IN (SELECT parent_id " 
       "       FROM files " 
       "       WHERE created_at > '1293861600') " 
       "    ,1 ,0)) " 
       "  /COUNT(1) " 
       " FROM users " 
       " WHERE users.registered_at BETWEEN '1293861600' AND '1303729537' " 
      ) 
2

你可能需要在您的查询前加上SELECT

1

你一个选择整个事情之前需要,即:

cursor.execute("select (SELECT COUNT(1) FROM users WHERE " ... 
1

执行下面的查询,看你想要什么..

SELECT(SELECT COUNT(1)FROM用户WHERE registered_at BETWEEN 1293861600 AND 1303729537 AND user_id IN(SELECT parent_id FROM files WHERE created_at> 1293861600))/(SELECT COUNT(1)FROM users WHERE registered_at BETWEEN 1293861600 AND 1303729537)As Results

如果您只有一个结果,这两个本身选择语句。