#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.