php
  • mysql
  • group-by
  • 2011-05-24 2 views 3 likes 
    3

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

    $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

    ответ

    1

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

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

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

    +1

    'выбрать * ... группа by' будет работать в MySQL. возвращаемая строка для негруппированных строк не определена, но обычно первая найдена – knittl

    +0

    @knittl - Вы правы, это будет «работать» в MySQL. Это даже позволит вам заставлять минимальное или максимальное значение отображаться в одном из колонок, указывая несвязанный «ORDER BY». Аккуратный рубить. : -/ – Lumi

    +0

    спасибо за ответ и извините за задержку в моем ответе. Вы правы в указанных выше пунктах.Я опубликую то, что я закончил делать. Благодарю. – Kevin

    0

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

    $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; 
    } 
    

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

    0
    $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

    Ошибка синтаксиса ... –

    +0

    Исправлена ​​ошибка синтаксиса – yitsushi

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