Для правильного вопроса надо знать половину ответа
А зачем тут multi_query, если вызывается один запрос INSERT?
Перед циклом делаете prepare, привязываете параметры через bind_param. В цикле устанавливаете значения переменных и вызываете execute.
Для правильного вопроса надо знать половину ответа
С чего вы взяли, что multi_query - это асинхронный запрос? PHP вообще асинхронно не работает. Если у вас используется какая-то своя библиотека, то ответ надо искать в её доках.
Для правильного вопроса надо знать половину ответа
JOIN - декартово умножение.
Одна строка из `theme`, к ней две из `post s`, ноль из `video` игнорируем (LEFT), одна из `subscribe`
Перемножаем, 1*2*1*1 = 2, что вы и получаете.
Если в `subscribe` будут две строки, получим 1*2*1*2 = 4
Для правильного вопроса надо знать половину ответа
Если нужен полный лог, то таки да, записываете каждое включение и выключение. Дополнительно при выключении обновляете общее время работы в отдельной таблице.
Если полного лога не надо, то просто записываете время включения, при выключении обновляете общее время работы и обнуляете (null) время включения.
Для правильного вопроса надо знать половину ответа
Ваш запрос не будет работать в новых версиях MySQL с настройками по умолчанию. При группировке все выбираемые поля должны быть агрегатными функциями или полями, по которым идёт группировка.
В старых версиях запрос отработает, но ничего осмысленного не выдаст. Если есть две записи с разными id и одинаковыми type, то какой из этих id вы расчитываете получить? MySQL не гарантирует какого-либо определённого значения в этом случае. Как и не гарантирует, что выбранные id и status будут из одной строки.
Для правильного вопроса надо знать половину ответа
SELECT `user_id`, ABS(DATEDIFF(`t0`.`date`, `t1`.`date`)) AS `days`
FROM (
SELECT `user_id`, MAX(`date`) as `date`
FROM `table`
WHERE `status` = 0
GROUP BY `user_id`
) AS `t0`
JOIN (
SELECT `user_id`, MAX(`date`) as `date`
FROM `table`
WHERE `status` = 1
GROUP BY `user_id`
) AS `t1` USING `user_id`