Mysql запрос / количество в php help-count количество случаев, отличных от идентификаторов

Допустим, у нас есть две таблицы:

users
id     login     password
1      user1     $432rget5343
2      user2     $432rget5343
3      user3     $432rget5343trips
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. водитель с идентификатором 1 ехал с пассажирами 2 и 3, поэтому люди с идентификаторами 2 и 3 обязаны «1» тому, у кого идентификатор 1

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

  3. Идентификатор 1 снова является драйвером, поэтому теперь идентификатор 2 имеет +1 для идентификатора 1, а парень с идентификатором 3 теперь «должен» +2 для водителя с идентификатором 1

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

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

Есть идеи, как сделать это правильно?

-2

Решение

Предполагая, что вы не можете изменить структуру базы данных и используете 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)
0

Другие решения

Других решений пока нет …