Результат запроса PHP MYSQL "РЕЙТИНГ" - PullRequest
0 голосов
/ 31 декабря 2010

Мне нужно получить список пользователей Ранжирование по точкам и из моей командной строки (MySQL) смог сгенерировать необходимый код:

SET @rank=0;
SELECT rank, iduser, pontos FROM (
SELECT @rank:=@rank+1 AS rank,
       SUM(points.points) AS pontos,
       points.iduser,
       users.name,
       users.idade
  FROM points
       INNER JOIN
       users
       ON (points.iduser = users.id)
 WHERE (users.idade >= %s) AND (users.idade <= %s)
GROUP BY points.iduser ORDER BY pontos DESC) AS totals WHERE iduser = %s

Проблема в том, что мне нужно это запуститьAMFPHP и я проверили его в тестовом PHP-файле и, похоже, я не могу использовать SET и SELECT в одном и том же «mysql_query».

Я посмотрел, а некоторые использовали для этого mysql_query (Я проверил это, и оно работает), но могу ли я доверять этому, чтобы оно было эффективным и безошибочным?Работает ли это так же, как в транзакциях MySQL, или установка @rank в отдельном запросе может привести к неожиданным результатам?

Ответы [ 3 ]

1 голос
/ 01 января 2011

Спасибо за быстрые ответы. Я решил попробовать первый вариант и построить запрос с внутренним объединением, установив @rank в select.

Мне пришлось поменять немного, потому что конечный результат оказался не таким, как я ожидал, поскольку упорядочивал список по точкам после добавления инкремента. Я не эксперт в MySQL, но это то, что я сделал, пока работает:

SELECT rank, pontos FROM (
SELECT @rank:=@rank+1 AS rank, iduser, idade, pontos FROM (
 SELECT SUM(points.points) AS pontos,
 points.iduser,
        users.name,
        users.idade
        FROM points 
        INNER JOIN
        users
        ON (points.iduser = users.id)
 WHERE (users.idade >= 10) AND (users.idade <= 24)
 GROUP BY points.iduser ORDER BY pontos DESC ) AS pointsList
 INNER JOIN
 (SELECT @rank :=0) AS ranker ) AS ranking WHERE iduser = 2

Мне пришлось добавить «AS», чтобы он не выдавал ошибку из-за отсутствия псевдонима в каждой производной таблице ...

1 голос
/ 31 декабря 2010

Используйте этот запрос без SET:

SELECT rank, iduser, pontos FROM (
SELECT @rank:=@rank+1 AS rank,
       SUM(points.points) AS pontos,
       points.iduser,
       users.name,
       users.idade
  FROM points
       INNER JOIN
       users
       ON (points.iduser = users.id)
             INNER JOIN
             (SELECT @rank :=0)
 WHERE (users.idade >= %s) AND (users.idade <= %s)
GROUP BY points.iduser ORDER BY pontos DESC) AS totals WHERE iduser = %s
0 голосов
/ 31 декабря 2010

MySQL в PHP не позволяет выполнять несколько запросов за один вызов mysql_query() в качестве меры защиты от атак с использованием SQL-инъекций.Это останавливает атаку Little Bobby Tables на своем пути (но не защищает от других типов инъекционных атак).

Пока вы выполняете запрос SET, используя тот же сеанс сценарияи тот же дескриптор базы данных, что и у запроса, нет причины, по которой вы не можете разделить это на два отдельных вызова.

mysql_query("SET @rank:=0;");
$res = mysql_query("SELECT ....");

будет работать нормально.Однако, если вы делаете это через AMF и имеете отдельные сервисные функции AMF для выполнения SET и SELECT по отдельности, то, скорее всего, это не сработает.Каждый вызов службы AMF представляет собой отдельный HTTP-запрос, который означает каждый раз новый (и другой) дескриптор MySQL, поэтому начальный SET будет выполнен в одном сеансе, забыт, а затем SELECT будет выполнен в другом сеансе и будет иметь совершенно другой @ранга.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...