2016-08-18 4 views
0

У меня есть таблица истории, которая содержит изменения, внесенные в данные, и дату внесения изменения - история - это старые значения и дата внесения изменения.Получить содержимое следующей строки на основе даты в предыдущей строке

Существует тогда основная таблица, которая содержит текущие значения.

Фактические макеты таблиц, как:

history 

id user_id colour change_date 
1 1  Red 2016-01-01 
2 1  Blue 2016-04-05 
3 1  Green 2016-08-05 

, а затем:

current 

user_id colour entry_date 
1  Yellow 2015-10-14 

Я хочу, чтобы попытаться получить хронологический список всех значений, так выход для user_id 1 будет выглядеть :

2015-10-14 Red 
2016-01-01 Blue 
2016-04-05 Green 
2016-08-05 Yellow 

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

2015-10-14 Yellow 

Однако, когда они имеют историю я запуская с датой ввода и назначить первую историю цвета в том, что и хранящий в массиве ,

Затем я беру дату первой истории и получаю второе значение истории (через другой запрос) и сохраняю это в массиве и цикле и т. Д. - есть 150 тыс. Пользователей, и каждый может иметь 20 или 30 изменений, и это ужасно неэффективно!

Я хотел бы найти более эффективный способ сделать это либо в PHP, либо в MySQL - может ли кто-нибудь помочь?

+0

показать нам, что вы уже пробовали. Возможно, попробуйте использовать 'inner join' и' order by' в SQL targettng ваши таблицы и даты? – KDOT

+0

У меня есть что-то, что работает, но оно истекает на сервере по мере превышения максимального времени выполнения (6 минут), поэтому я надеюсь найти эффективный способ сделать это – bhttoan

+0

, так, например, таблица истории: 'SELECT color , change_date FROM history WHERE user_id =? ORDER BY change_date ASC' дает вам время?Что вы используете, PDO/mySQL/mySQLi и т. Д.? и вы установили, что ваше соединение стабильно и не имеет ошибок? действительно нужно показать какой-то код – KDOT

ответ

0

Во-первых, я не знаю, какой класс подключения вы решили использовать, но для этого я предоставил класс, который я написал для запроса, который использует PDO.

class Entity extends PDO { 
    public function __construct(
    ) { 
     try { 
      parent::__construct(
       'mysql:host=localhost;dbname=example', 
       'db_user', 
       'db_pass' 
      ); 
     } catch (PDOException $ex) { 
      die($ex->getMessage()); 
     } 
    } 

    public function query(
     $statement, 
     $values = array() 
    ) { 
     $stmp = parent::Prepare($statement); 
     $stmp->execute($values); 
     return $stmp; 
    } 
} 

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

$con = new Entity(); 
$user_id_example = 1; 

$sql = 'SELECT colour, change_date FROM history WHERE user_id = ? ORDER BY change_date ASC'; 

var_dump($con 
    ->query($sql, [$user_id_example]) 
    ->fetchAll() 
); 

Update: Если вы пытаетесь получить новейшие изменения журнала вы можете добавить LIMIT к вашему запросу

$sql = 'SELECT colour, change_date FROM history WHERE user_id = ? ORDER BY change_date ASC LIMIT 1'; 

Update: Обратите внимание, что если вы хотите, чтобы принести результаты из обоих текущей таблицы и история, вы можете использовать INNER JOIN

$sql = 'SELECT colour, change_date FROM history h INNER JOIN current c ON h.change_date = c.change_date WHERE user_id = ? ORDER BY change_date ASC'; 
0

Я предлагаю вам два querys, в первом вы будете иметь цвета заказанные и во втором вы будете иметь даты заказанные, поэтому в PHP вы будетеимеют два массива с данными и остается только собрать данные.
Существует код, только вы должны установить СВЯЗЬ в базу данных

$sqlColour = "select c.user_id, u.colour from current as c inner join (select user_id, colour from history union all select user_id , colour from current) u on c.user_id=u.user_id"; 
$sqlDate = "select c.user_id, u.date from current as c inner join (select user_id, entry_date as date from current union all select user_id , change_date as date from history) u on c.user_id=u.user_id"; 

$stmt = $db->query($sqlColour); 
$colours = $stmt->fetchAll(); 
$stmt = $db->query($sqlDate); 
$dates = $stmt->fetchAll(); 

$answer = array(); 
for ($i = 0; $i < count($colours); $i++) { 
    $answer[] = array("date" => $dates[$i]['date'], "colour" => $colours[$i]['colour'], "user_id" => $colours[$i]['user_id']); 
} 
echo $answer; 
Смежные вопросы