SELECT
subquery.opponent_id,
subquery.last_message_datetime,
m.message AS last_message
FROM (
SELECT
CASE
WHEN m.from_user_id = 4 THEN m.to_user_id
ELSE m.from_user_id
END AS opponent_id,
MAX(m.datetime) AS last_message_datetime
FROM messages AS m
WHERE m.from_user_id = 4 OR m.to_user_id = 4
GROUP BY opponent_id
) AS subquery
LEFT JOIN messages AS m ON (
(m.from_user_id = 4 AND m.to_user_id = subquery.opponent_id)
OR
(m.to_user_id = 4 AND m.from_user_id = subquery.opponent_id)
) AND m.datetime = subquery.last_message_datetime
insert into
вызывает ошибку из-за дубликата, это можно решить разными способами.insert ignore into
. Это приведёт к тому, что при наличии дубликата запись не будет добавлена, но при этом выполнение скрипта продолжится.replace into
. В этом случае старая запись будет заменена новой. Но если у какой-то другой таблицы создана связь с этой посредством foreign key
с каскадной реакцией, это приведёт к удалению всех ссылающихся на этот ключ записей.on duplicate key update
:insert into films (img, img_vertical, trayler...) values (:img, :img_vertical, :trayler...)
on duplicate key update
set img = :imgUpd , img_vertical = :img_verticalUpd, trayler = :trayler итд ...;
select * from tableName where `date` > now() - interval 10 day
select id, login, `date`, (`date` > now() - interval 10 day) as suc from tableName
class DB
{
public ?PDO $pdo;
private ?array $opt;
public ?string $pHolders;
public ?array $parArr;
public function __construct(
string $connectName = '',
string $charset = 'utf8mb4',
bool $flat = false
)
{
if($flat) return;
$con = ConnectDB::byName($connectName);
$dsn = "mysql:host=$con->host;dbname=$con->name;charset=$charset";
$this->opt = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => FALSE
];
$this->pdo = new PDO($dsn, $con->user, $con->pass, $this->opt);
}
public function qwe($sql, $args = NULL): bool|PDOStatement
{
if (!$args) {
return self::query($sql);
}
return self::execute($sql, $args);
}
private function execute(string $sql, array $args): PDOStatement
{
$stmt = $this->pdo->prepare($sql);
$stmt->execute($args);
return $stmt;
}
private function query($sql): PDOStatement
{
return $this->pdo->query($sql);
}
}
function qwe(string $sql, array $args = null): bool|PDOStatement
{
global $DB;
//Синглтон
if(!isset($DB)){
$DB = new DB();
}
return $DB->qwe($sql,$args);
}