SUM строк файла для итога и сделать запрос с итогом. PHP MSSQL

0

У меня есть такой файл

FG  09097612 DN 6575 HL    879797
BHC 09097613 DN 6576 HL    879798
FG  09097614 DN 6577 IOPPP 879799
FG  09097614 DN 6577 IOPPP 879800

и я импортирую его в mysql с помощью

$lines = file("upload/import.txt");
$dbhandle = odbc_connect("Driver={SQL Server Native Client 11.0};
Server=$myServer;Database=$myDB;", $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
$query = "INSERT INTO TEST (nation) VALUES \n";
$row = array(); // query for each line
foreach($lines as $lineNum => $line ) {
    $nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
    $prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
    $player = trim(substr($line, 12, 2)); // get 13th-14th characters as player and remove spaces
    $row []= "(".$nation.")";
}
$query .= implode(",\n",$row).";";
$result = odbc_exec($dbhandle, $query);

Теперь мне нужно проверить, есть ли в файле строки с одной и той же нацией, в этом примере "FG" и суммировать $prize каждого "FG" и сохранять только общую сумму в выигрыше, а не все строки FG?

  • 0
    Загрузите их в массив и проверьте
  • 0
    Как сделать? Код хорош? Что вы думаете?
Показать ещё 5 комментариев
Теги:
sql-server
arrays
file

3 ответа

1

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

Что-то вроде этого:-

<?php

$lines = file("upload/import.txt");
$dbhandle = odbc_connect("Driver={SQL Server Native Client 11.0};
Server=$myServer;Database=$myDB;", $myUser, $myPass)
or die("Couldn't connect to SQL Server on $myServer");
$query = "INSERT INTO TEST (nation, prize) VALUES \n";
$row = array(); // query for each line
foreach($lines as $lineNum => $line ) 
{
    $nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
    if (array_key_exists($nation, $row))
    {
        $row[$nation]['prize'] += $prize;
    }
    else
    {
        $prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
        $player = trim(substr($line, 12, 2)); // get 13th-14th characters as player and remove spaces
        $row[$nation]= array('nation'=>$nation, 'prize'=>$prize);
    }
}
array_walk($row, function($v, $k){return "(".$v['nation'].", ".$v['prize'].")";});
$query .= implode(",\n",$row).";";
$result = odbc_exec($dbhandle, $query);

?>

Однако, если это было сделано в MySQL, у меня возникло бы желание просто наделить страну уникальным ключом в базе данных и добавить в конец запроса на вставку ON DUPLICATE KEY SET приз = приз + VALUES (приз).

0

Вы можете написать действительно сложный PHP-код для этого. Или вы можете изменить свою стратегию. Во-первых, позвольте мне указать, что вы можете просто использовать load data infile для чтения данных из файла.

Новая стратегия состоит в том, чтобы прочитать данные в промежуточную таблицу и затем скопировать ее в итоговую таблицу. В основном:

read data into test_staging table (using php or 'load data infile')

insert into test(nation, prize)
    select nation, sum(prize)
    from test_staging
    group by nation;

drop table test_staging;
  • 0
    Уважаемый Гордон, мне это нужно на PHP, а не на Mysql.
0

Поэтому, если вам это нужно в PHP, я бы предложил использовать именованный массив следующим образом:

$insertLines = array();
foreach($lines as $lineNum => $line ) {
    $nation = trim(substr($line, 0, 4)); // get first four characters as nation and remove spaces
    $prize = trim(substr($line, 4, 8)); // get 5th-12th characters as prize and remove spaces
    insertLines[$nation] += $prize;
}
foreach($insertLines as $lineNation => $linePrice ) {
    // The creation of the insert into the database goes here.
}

И, пожалуйста, проверьте длину. Я думаю, что на плазме в 14-15?

$player = trim(substr($line, 13, 2));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню