Правильное хранение ответа на запрос с помощью GROUP BY с использованием PHP - PullRequest
0 голосов
/ 13 февраля 2020

У меня есть большая база данных, в которой хранится много информации о клиентах, счетах и ​​т. Д. Я хочу, используя идентификаторы клиентов, найти все их счета, SUM () цену, содержащуюся в каждом из них, и сохранить их, чтобы распечатать один уникальный счет.

Итак, я перебрал размышляя об этом:

try {
    $conn = new PDO('mysql:host=myhost;dbname=accounting','user','pass');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
}catch(PDOException $e){
    echo "ERROR: " . $e->getMessage();
}



$stmt = $conn->prepare('SELECT GROUP_CONCAT(DISTINCT source_external_subscriber_id) AS ids 
                        FROM cdr');
$stmt->execute();
foreach ($stmt as $row) {
    $string = $row['ids'];
}

$array = explode(',', $string);
array_pop($array);
array_shift($array);


$destinationId = 0;
foreach ($array as $id) {
    $stmt2 = $conn->prepare('SELECT id, call_type, source_customer_cost 
                            FROM cdr 
                            WHERE source_external_subscriber_id = :id 
                            AND destination_account_id = :destinationId');

    $stmt2->execute(array('id' => $id, 'destinationId' => $destinationId));

    foreach ($stmt2 as $row2) {
        $datos[] = $row2;
    }
}

Результат меня не убедил, поэтому я решил проверить себя, выполняя сначала мой код, а затем ища клиента, чтобы сравнить количество счетов с длиной массива. (отсюда и отсутсвие отсутствия SUM ()) Затем, когда я искал более убедительный способ, я наткнулся на этот действительно полезный пост . Поэтому я изменил свой код на это. Но здесь они только объясняют, как написать запрос, а не как сохранить его в массиве.

try {
    $conn = new PDO('mysql:host=host;dbname=accounting','user','pass');
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $conn->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    var_dump($conn);
}catch(PDOException $e){
    echo "ERROR: " . $e->getMessage();
}

$destinationId = 0;
$stmt2 = $conn->prepare('SELECT source_external_subscriber_id, source_customer_cost FROM cdr WHERE destination_account_id = :destinationId GROUP BY source_external_subscriber_id');
$stmt2->execute(array('destinationId' => $destinationId));

foreach ($stmt as $row) {
     $datos[] = $row2;
}

Теперь мне было интересно, как правильно хранить данные, чтобы они выглядели примерно так:

array = [
    0 => array(
            "id" => source_external_subscriber_id1,
            "total" => SUM(source_customer_cost)
         ),
    1 => array(
            "id" => source_external_subscriber_id2,
            "total" => SUM(source_customer_cost) 
         )...
];

Спасибо всем за помощь, надеюсь, у вас отличный день !

Ответы [ 2 ]

1 голос
/ 13 февраля 2020

Так что, если я вас правильно понимаю, вы ищете что-то вроде этого:

SELECT source_external_subscriber_id id, (SELECT SUM(source_customer_cost)) total FROM cdr GROUP BY source_external_subscriber_id;
0 голосов
/ 14 февраля 2020

Таким образом, ответ на этот вопрос был хитрым и простым: массив, возвращаемый запросом, имел дублированные строки, возможно, я ошибся в выражении for-each, поскольку недавно начал их использовать. В любом случае, вот и запрос, и мое решение для хранения:

$destinationId = 0;
$stmt2 = $conn->prepare('SELECT source_external_subscriber_id, SUM(source_customer_cost) FROM cdr WHERE destination_account_id = :destinationId GROUP BY source_external_subscriber_id');
$stmt2->execute(array('destinationId' => $destinationId));

foreach ($stmt2 as $row2) {
    $data[] = $row2;
}

for ($i=0; $i < sizeof($data); $i++) { 
    $sanitizedData[$i] = array(
        0 => $data[$i][0],
        1 => $data[$i][1]
    );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...