2016-05-21 7 views
-2

Допустим, у нас есть две таблицы:Mysql запрос/кол в PHP help- рассчитывать количество occurencies отчетливых идентификаторов

users 
id  login  password 
1  user1  $432rget5343 
2  user2  $432rget5343 
3  user3  $432rget5343 


trips 
id  date   driver_id  passengers 
1  19-05-2016 1    [2][3] 
2  19-05-2016 2    [1][3] 
3  19-05-2016 1    [2][3] 
4  19-05-2016 1    [2] 

В основном цель всего сценария, чтобы следить за руль, чтобы работать в группе из нескольких человек. Каждый день кто-то ездит (driver_id) , и мне нужно как-то рассчитать, кто должен ехать дальше. Выше представлены таблицы, которые я придумал, большая часть скрипта уже выполнена, но я застрял в подсчете этого.

Из вышеприведенных таблиц желаемый результат должен быть:

  1. водитель ID 1 ехал с пассажирами 2 и 3, следовательно, люди с идентификатором 2 и 3 обязаны "1" на один с идентификатором 1

  2. парень с ID 2 ехал на этот раз, поэтому его счетчик по отношению к парню с ID 1 теперь равно нулю, и пассажир три сейчас «задолжал» +1 для ID-1 и +1 для ID-2

  3. идентификатор 1 драйвер снова, так что теперь id 2 имеет +1 для id 1, а парень с id из 3 теперь «обязан s»+2 для водителя с идентификатором 1

  4. 1, водитель снова, но он берет только один пассажир, поэтому парень с идентификатором 2 теперь„задолжал“+2 для ид 1

Надеюсь, что мои объяснения ясны. Извините, вы должны были это прочитать. Данные буквально такие же, как и на свалках выше (с квадратными скобками и т. Д.)

Любая идея, как это сделать правильно?

+1

звучит как присвоение класса. Вы еще что-нибудь пробовали? Я бы структурировал таблицы по-разному. – chris85

+0

На данный момент речь идет о том, как это сделать. Как бы вы изменили структуру таблицы? – Adam

+0

Отделите данные, чтобы таблица была нормализована, 1 строка за значение. – chris85

ответ

0

Предполагая, что вы не можете изменить структуру базы данных, и что вы используете MySQL, то вы можете сделать это:

// Set up the connection to the database 
$mysqli = new mysqli(HOST, USER, PASS, DBNAME); 

// Execute the query 
$results = $mysqli->query('SELECT driver_id, passengers FROM trips'); 

// Here we store all trips records 
$records = []; 

// Loop through all results 
while($row = $results->fetch_array()) 
{ 
    $driver_id = $row[0]; 

    // If the driver id is not in the records, we add it 
    if(!array_key_exists($driver_id, $records)) 
    { 
     $records[$driver_id] = []; 
    } 

    // We parse the passenger string and retrieve an array with the ids 
    $passengers = explode('[', substr(str_replace(']', '', $row[1]), 1)); 

    // We check every passenger 
    foreach ($passengers as $passenger) { 

     $passenger_id = intval($passenger); 

     // As the driver drove the passenger, he owes -1 to him 
     $records[$driver_id][$passenger_id]--; 

     // If the passenger's id is not in the records, we add it 
     if(!array_key_exists($passenger_id, $records)) 
     { 
      $records[$passenger_id] = []; 
     } 

     // We update the passenger debt towards the driver 
     $records[$passenger_id][$driver_id]++; 
    } 

} 

foreach($records as $id => $record) 
{ 
    foreach($record as $other_id => $iou) 
    { 
     // We are only interested in positive values 
     if ($iou > 0) 
      echo "Driver #$id owes driver #$other_id $iou trip(s)</br>"; 
    } 
} 

Это даст вам следующий вывод:

Driver #2 owes driver #1 2 trip(s) 
Driver #3 owes driver #1 2 trip(s) 
Driver #3 owes driver #2 1 trip(s)