我有一個聊天網站,我希望用戶有一個可用的用戶串列,這些用戶按他們最后一次聊天的人排序(比如 whatsapp)。我該怎么做呢?我嘗試了很多堆疊溢位的答案,但到目前為止,沒有一個對我有用。當使用我現在使用的代碼時,用戶的名字會為每條存在的訊息重復。此查詢不起作用:“SELECT * FROM dms WHERE sentTo =”.$_SESSION['id']。”或 sentBy =“。$_SESSION ['id']。”; 這是我的資料庫的樣子:

這是我的代碼:
<?php
$sql = "SELECT * FROM dms WHERE sentTo = ".$_SESSION['id']." or sentBy = ".$_SESSION['id'].";";
$result = mysqli_query($conn, $sql);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$sql2 = "SELECT id, username FROM users WHERE id = ".$row['sentTo'].";";
$result2 = mysqli_query($conn, $sql2);
if (mysqli_num_rows($result2) > 0) {
while ($row2 = mysqli_fetch_assoc($result2)) {
echo "<a href='dms.php?talkingTo=".$row2['id']."'>".$row2['username']."</a>";
}
}else{
echo "<p>It's empty</p>";
}
}
}else{
echo "<p>It's empty</p>";
}
?>
uj5u.com熱心網友回復:
通過使用此查詢:
"SELECT * FROM dms WHERE sentTo = ".$_SESSION['id']." or sentBy = ".$_SESSION['id'].";
- 您當前正在做的是查詢發送給當前用戶(在會話中)或從當前用戶發送的所有可用 DM。所有 DM 都意味著同一對話(即聊天)的重復條目
- 但是您想要實作的是列出該用戶的所有獨特“聊天”,并根據每次聊天的最新活動對該串列進行排序
如果我錯了,請糾正我。
您需要做的是根據sentBy和sentTo列組合的相似性對聊天進行分組。如果您想跳過重復項,這永遠不會相似。此外,您希望根據date列降序排列聊天。
從一個被接受的答案到一個幾乎相似的問題,我得到了“一種使用相關子查詢來做你想做的事情的方法,以找到匹配對話的最小創建日期/時間”。
它還根據日期對結果進行排序。
因此,進行這些更正并將查詢從舊問題自定義到您的背景關系 - 您使用的上述查詢應更改為(where 1通過連接會話中的 id 替換:$_SESSION ['id']):
SELECT m.*
FROM dms m
WHERE 1 in (sentBy, sentTo) AND
m.date = (SELECT MAX(m2.date)
FROM dms m2
WHERE (m2.sentBy = m.sentBy AND m2.sentTo = m.sentTo) OR
(m2.sentBy = m.sentTo AND m2.sentTo = m.sentBy)
)
ORDER BY m.date DESC
我在您的 dms 表的相同資料集上運行此查詢并獲得了 2 個獨特的結果。
您可能需要檢查的另一件事是您要使用錨點生成的鏈接:
echo "<a href='dms.php?talkingTo=".$row2['id']."'>".$row2['username']."</a>";
這是回應id當前用戶的。我想你應該回應id他們正在和誰聊天?如果是這樣,您需要運行查詢以獲取它的發件人。
希望這可以幫助。
uj5u.com熱心網友回復:
我會按聊天物件分組 -
<?php
$sql = "
SELECT u.username, t.mostRecent
FROM (
SELECT IF(sentTo = {$_SESSION['id']}, sentBy, sentTo) chatWith, MAX(date) mostRecent
FROM dms
WHERE sentTo = {$_SESSION['id']} OR sentBy = {$_SESSION['id']}
GROUP BY chatWith
) t
JOIN users u ON t.chatWith = u.id
ORDER BY t.mostRecent DESC";
我已經用 1M 隨機(ish)生成的行對此進行了測驗,并且它在我的本地開發機器上以不到 0.01 秒的速度持續回傳。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/533977.html
標籤:PHP数据库数据库
上一篇:RedshiftTIMEZONE函式的意外結果(將時間戳列從UTC轉換為另一個時區)
下一篇:SQL在NOTNULL時移動資料
