2012-03-04 4 views
0

Я пытаюсь посчитать freelanceFeedback и поручения по кол-ву, как это:MySQL - Рассчитывать на объединение

$sql = "SELECT authentication.*, (SELECT COUNT(*) FROM freelanceFeedback) as taskscount FROM authentication 
      LEFT JOIN freelanceFeedback 
      ON authentication.userId=freelanceFeedback.FK_freelanceWinnerUserId 
      WHERE `FK_freelanceProvider`=$what 
      ORDER BY taskscount DESC"; 

Но у меня несколько выходов, если пользователь имеет несколько обратных связей, и это не сортировка по taskscount.

Я не могу понять, что 'чирикать' неправильно ..

** UPDATE ** Я думаю, что у меня есть это сам:

$sql = "SELECT DISTINCT authentication.*, 
      (SELECT COUNT(*) FROM freelanceFeedback 
      WHERE FK_freelanceWinnerUserId=userId 
      ) as taskscount 
      FROM authentication 
      WHERE `FK_freelanceProvider`=$what 
      ORDER BY taskscount DESC"; 

Это только вывод 1 пользователя и ЗАКАЗАТЬ на количество обратных ссылок.

+1

предоставьте примерную таблицу. Я считаю, что вы должны использовать GROUP BY, но сложно сделать точный запрос без данных образца. – mkk

+0

Не используйте *, если можете - плохо для производительности, иногда и плохо для читаемости все время. Укажите нужные столбцы, и если вы используете COUNTING, просто используйте идентификатор таблицы. –

ответ

1

При использовании COUNT(), необходимо также использовать GROUP BY:

SELECT authentication.userId, 
      COUNT(freelanceFeedback.id) AS taskscount 
     FROM authentication 
LEFT JOIN freelanceFeedback 
     ON authentication.userId = freelanceFeedback.FK_freelanceWinnerUserId 
    WHERE `FK_freelanceProvider`= $what 
    GROUP BY authentication.userId 
    ORDER BY taskscount DESC 

Однако, это будет работать только если вы не делаете SELECT * (что плохая практика в любом случае). Все, что не входит в бит COUNT, должно идти в GROUP BY. Если это включает текстовые поля, вы не сможете это сделать, поэтому вам нужно сделать JOIN для подзапроса. MySQL не будет жаловаться, если вы этого не сделаете, но это может серьезно замедляют вещи и другие блоки данных выдаст ошибку, так что лучше сделать это правильно:

SELECT authentication.userId, 
      authentication.textfield, 
      authentication.othertextfield, 
      subquery.taskscount 
     FROM authentication 
LEFT JOIN (SELECT freelanceFeedback.FK_freelanceWinnerUserId, 
        COUNT(freelanceFeedback.FK_freelanceWinnerUserId) AS taskscount 
       FROM freelanceFeedback 
      GROUP BY FK_freelanceWinnerUserId) AS subquery 
     ON authentication.userId = subquery.FK_freelanceWinnerUserId 
    WHERE authentication.FK_freelanceProvider = $what 
    ORDER BY subquery.taskscount DESC 

Это не ясно, что Таблица FK_freelanceProvider является частью так Я предположил, что это аутентификация.

Смежные вопросы