GROUP BY отдавать приоритет в MySQL - PullRequest
3 голосов
/ 25 мая 2011

У меня есть следующий запрос.

$query_assignments = "SELECT * FROM tb_scheduler_assignments 
                      WHERE company_id = '".$company_id."' OR 
                      dept_id = '".$dept_id."' OR 
                      user_id = '".$user_id."' ORDER BY 
                      due_date GROUP BY purchase_id";

Что мне нужно, так это решение с одним запросом, которое сохранит результаты для user_id более dept_id и dept_id более company_id.

Например:

  • , если то же самое purchase_id происходит для строк, полученных с помощью dept_id и user_id, тогда я хочу получить результат только для user_id;
  • , если то же самое purchase_id происходит для строк, которые были получены с помощью company_id и user_id, тогда я хочу получить результат только для user_id

Ответы [ 3 ]

1 голос
/ 25 мая 2011

Во-первых, вы интерполируете переменные в своем SQL, что предполагает, что вы можете быть уязвимы для внедрения SQL. Просто чтобы убедиться. PHP должен предлагать подготовленные операторы или некоторые экранирующие функции.

Во-вторых, ваш оператор SQL не будет компилироваться, потому что вы используете GROUP BY a, но выбираете *, который включает как минимум еще три столбца.

В-третьих, кажется, что вы неправильно понимаете SQL, думая, что он может в запросе, таком как вы пытаетесь сформулировать (без UNION ALL), получить повторяющиеся строки, то есть одну и ту же строку несколько раз, потому что она соответствует несколько критериев. Это не так.

0 голосов
/ 12 июня 2011
$query_assignments = "SELECT *,
                      IF(user_id = {$user_id}, 30,
                        IF(dept_id = {$dept_id}, 20,
                          IF(company_id = {$company_id}, 10, 0)
                        )
                      ) as priority
                      FROM tb_scheduler_assignments 
                      WHERE company_id = {$company_id} OR 
                      dept_id = {$dept_id} OR 
                      user_id = {$user_id}
                      GROUP BY purchase_id
                      ORDER BY due_date, priority DESC";

Вы можете создать виртуальное поле с помощью оператора if.

user_id:      30 pts
dept_id:      20 pts
company_id:   10 pts
else:          0 pts

ВНИМАНИЕ: не может быть проиндексировано!

Синтаксис FIX: GROUP BY и ORDER BY переупорядочены

0 голосов
/ 03 июня 2011

Решение "одного запроса", которое я искал, кажется, не существует, или, если оно существует, оно будет намного медленнее, чем простая сортировка в php. Итак, я выполнил 3 отдельных запроса, поместил каждый из них в массивы, а затем, чтобы поместить их все в окончательный массив с нужной мне иерархией, я сделал следующие циклы, чтобы увидеть, существует ли параметрID для всех уровней иерархия. Если этого не произошло, я помещаю его в массив.

$finalArray = array();
foreach ($companyArray as $purchaseID => $companyData) {
    if (empty($deptArray[$purchaseID]) && empty($userArray[$purchaseID])) {
        $finalArray[] = $companyData;
    }
}
foreach ($deptArray as $purchaseID => $deptData) {
    if (empty($userArray[$purchaseID])) {
        $finalArray[] = $deptData;
    }
}
foreach ($userArray as $purchaseID => $userData) {
    $finalArray[] = $userData;
}

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

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