previned Ответов: 1

Как добавить внутреннее соединение или левое соединение в PHP mysql


я создаю скрипт подсчета непрочитанных сообщений в php mysqli. я добавил inner join sql к своему существующему коду, который отображает все сообщения пользователей как одно и то же непрочитанное сообщение. я хочу знать, как присоединиться к таблице inner join или left join users с помощью таблицы pm.

пример такой
user1 unread 4
user2 unread 4
user3 unread 4


я хочу показать вот такие результаты
user1 unread 4
user2 unread 7
user3 unread 2



мой ПМ таблице базы данных
id  from_id     to_id    msg               sent_date              read
1   2           3        hi how are you?   2019-12-05 04:14:20    1
2   3           2        fine              2019-12-05 05:15:58    0
3   2           3        hi                2019-12-05 03:20:34    1
4   5           2        hi                2019-12-05 08:30:40    0



пользовательская таблица
userid    username
2         previn

3         raj

5         rajesh  




Вот мой код

<?php
 if (isset($_SESSION['userid'])) {
    $session_id = $_SESSION['userid'];
 }



$sql = "SELECT *,


(SELECT username FROM users WHERE userid=from_id) AS from_username,
(SELECT username FROM users WHERE userid=to_id) AS to_username,
(SELECT username FROM users WHERE userid=?) AS my_username,

(SELECT count(*) unread from users INNER JOIN pm ON pm.from_id=users.userid where to_id=? and read=0)as unread



FROM pm WHERE from_id = ? or to_id=?   ORDER BY id DESC";

   
	if ($stmt = $con->prepare($sql)) {
		
   $stmt->bind_param('iiii',  $session_id, $session_id,$session_id,$session_id);
   $stmt->execute();
	  	}
   $result = $stmt->get_result();
   if ($result->num_rows > 0) {
   while ($row = $result->fetch_assoc()) {
	  
     echo $row['from_username'] . " -> " . $row['to_username'] . "<br>";
	  
	   
	  
      echo 'User ' . $row['from_id'] . ' - ' . $row['unread'] . "<br>";
   }
  }


?>


Что я уже пробовал:

Я пробовал здесь внутреннее соединение
(SELECT count(*) unread from users INNER JOIN pm ON pm.from_id=users.userid where to_id=? and read=0)as unread

1 Ответов

Рейтинг:
0

Wendelius

Если я правильно понимаю вопрос и упомянутый подзапрос является частью более крупного запроса, то проблема заключается в том, что вы запрашиваете все записи из таблицы pm от конкретного пользователя к другому пользователю. Другими словами, вы получите одинаковое количество непрочитанных строк для всех строк.

Но если это то, что вы действительно хотите, то вы могли бы попробовать что-то вроде

SELECT pm.*,
   (SELECT u.username FROM users u WHERE u.userid = pm.from_id) AS from_username,
   (SELECT u.username FROM users u WHERE u.userid = pm.to_id) AS to_username,
   (SELECT u.username FROM users u WHERE u.userid = ?) AS my_username,
   (SELECT count(*) FROM pm pm2 where pm2.to_id=pm.to_id and pm2.read=0)as unread
FROM pm 
WHERE pm.from_id = ? 
or    pm.to_id = ?   
ORDER BY pm.id DESC

Но, как уже было сказано, похоже, что вы извлекаете совершенно разные вещи в одном запросе, поэтому, вероятно, было бы лучше разделить его на два разных запроса: на который извлекаются данные pm и еще один, который извлекает количество непрочитанных сообщений. Последнее было бы просто
SELECT count(*) FROM pm where pm.to_id=? and pm2.read=0

Также обратите внимание, что my_username снова повторяет данные, так что выборки должно быть достаточно только один раз.


previned

Я проверил ваш скрипт но те же результаты отображают все непрочитанные сообщения пользователей одинаково

Wendelius

Именно это я и пытался сказать. Сумма повторяется в каждой строке.

Если вы хотите получить количество непрочитанных сообщений для одного пользователя, я предлагаю вам получить его отдельно. Это будет второй блок кода в решении.

previned

Большое спасибо!