Что не так с этим запросом?

#python #mysql

#python #mysql

Вопрос:

Я пытаюсь выполнить следующее в своей функции, но получаю сообщение об ошибке 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:

Вероятно, вам нужно добавить SELECT к вашему запросу.

Ответ №2:

 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' "
              )
  

Ответ №3:

Вам нужен select перед всем этим, таким образом:

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

Ответ №4:

Выполните приведенный ниже запрос, чтобы увидеть, что вы хотите..

ВЫБЕРИТЕ (ВЫБЕРИТЕ COUNT (1) ИЗ пользователей, ГДЕ registered_at МЕЖДУ 1293861600 И 1303729537 И user_id В ( ВЫБЕРИТЕ parent_id ИЗ файлов, ГДЕ created_at > 1293861600)) / (ВЫБЕРИТЕ COUNT (1) ИЗ пользователей, ГДЕ registered_at МЕЖДУ 1293861600 И 1303729537) В качестве результатов

Приведенное выше разделение будет работать, только если вы получите только один результат в обоих операторах select.