Форумы портала PHP.SU » » Работа с СУБД » Помогите написать SQL

Страниц (1): [1]
 

1. new01 - 18 Июня, 2011 - 12:45:30 - перейти к сообщению
Вот есть таблица с сообщениями.Поля "Отправитель" и " Получатель". Вот сижу и не могу додуматься как сделать SQL запрос,который посчитал коли-во переписок с одним пользователем. Т.е. написал пользватель name пользователю user 5 сообщений и пользователь user написал пользователю name 2 сообщения -- это одна переписка,переписка пользователя , переписка пользователя name с пользователем user. Как сделать такой SQL запрос ? Заранее спасибо.
2. Coder1994 - 18 Июня, 2011 - 12:48:22 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $rows = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name' AND `poluchatel` = 'user5'")->num_rows;
3. new01 - 18 Июня, 2011 - 12:55:22 - перейти к сообщению
Coder1994 пишет:
$rows = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name' AND `poluchatel` = 'user5'")->num_rows;

Посмотрел я ваш вариант. Это совсем неправильный вариант. До такого я и сам без проблем додумаюсь. Ваш вариант считает количество сообщений от одного пользователя другому.
4. Slavenin - 18 Июня, 2011 - 12:58:00 - перейти к сообщению
new01 пишет:
Вот есть таблица с сообщениями.Поля "Отправитель" и " Получатель". Вот сижу и не могу додуматься как сделать SQL запрос,который посчитал коли-во переписок с одним пользователем. Т.е. написал пользватель name пользователю user 5 сообщений и пользователь user написал пользователю name 2 сообщения -- это одна переписка. Как сделать такой SQL запрос ? Заранее спасибо.

какой вопрос такой ответ... непонятна структура таблицы и что собственно нужно посчитать
5. new01 - 18 Июня, 2011 - 13:05:56 - перейти к сообщению
Slavenin пишет:
какой вопрос такой ответ... непонятна структура таблицы и что собственно нужно посчитать

Хорошо объясняю ещё раз.
Есть таблица с двумя полями:"Отправитель","Получатель". Есть пользователь name. Мне надо посчитать кол-во польвзаотелей,с которыми он переписывался.
Привожу пример.
Name отправил 3 сообщения пользователю user.User отправил 5 сообщений name.Name отправил 4 сообщения User1 .User1 отправил 3 сообщения name.В данном случае получается,что name ввёл две переписки(прошу обратить внимание на слово переписки,просто вдумайтесь в него!). С пользователями User и User1.
6. Coder1994 - 18 Июня, 2011 - 13:25:47 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1. $rows = array();
  2. $r = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name'");
  3.         while ($row = $db->fetch_assoc($r))
  4.                 {
  5.                  if(!array_key_exists($rows, $row['poluchatel'])){
  6.                  $i = $i + 1;
  7.                  $rows = $row['poluchatel'];
  8.                 }
  9.                 }
  10. echo $i;
  11.  

Ну как-то так...
Хотя где-то тут ошибка, но лучше проверить.
7. Slavenin - 18 Июня, 2011 - 13:58:44 - перейти к сообщению
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(id) AS count FROM TABLE WHERE name = 'vasya' OR name2 = 'vasya' GROUP BY name
8. new01 - 18 Июня, 2011 - 13:59:21 - перейти к сообщению
Coder1994 пишет:
$rows = array();
$r = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name'");
while ($row = $db->fetch_assoc($r))
{
if(!array_key_exists($rows, $row['poluchatel'])){
$i = $i + 1;
$rows = $row['poluchatel'];
}
}
echo $i;


Ну как-то так...
Хотя где-то тут ошибка, но лучше проверить.

Да вот неплохая мысль. Всё проверил и исправил. Несколько замечаний.Пользователь может быть не только отправителем,но и получателем!
Вот исправленный код,который отлично работает.!
PHP:
скопировать код в буфер обмена
  1.  
  2. $rows = array();
  3. $i=0;
  4. $rs=mysql_query("SELECT * FROM `Messages` WHERE `Namereason` = 'name' OR Nametaker='name'");
  5.  
  6.         while ($row = mysql_fetch_assoc($rs))
  7.             {
  8.                         if($row['Nametaker']<>"name")
  9.                             {
  10.                                 $x=$row['Nametaker'];
  11.                                 }
  12.                                  else
  13.                                   {
  14.                                    $x=$row['Namereason'];
  15.                                    }
  16.                     if(!array_key_exists($x,$rows))
  17.                                 {
  18.                  $i = $i + 1;
  19.                  $rows[$x]=1;
  20.                 }
  21.             }
  22. echo $i;
  23.  
  24.  
  25.  

Но знаю,что это можно посчитать одним запросом SQL. Хотелось бы так.)
9. Coder1994 - 18 Июня, 2011 - 14:01:13 - перейти к сообщению
new01 пишет:
Coder1994 пишет:
$rows = array();
$r = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name'");
while ($row = $db->fetch_assoc($r))
{
if(!array_key_exists($rows, $row['poluchatel'])){
$i = $i + 1;
$rows = $row['poluchatel'];
}
}
echo $i;


Ну как-то так...
Хотя где-то тут ошибка, но лучше проверить.

Да вот неплохая мысль. Всё проверил и исправил. Несколько замечаний.Пользователь может быть не только отправителем,но и получателем!
Вот исправленный код,который отлично работает.!
PHP:
скопировать код в буфер обмена
  1.  
  2. $rows = array();
  3. $i=0;
  4. $rs=mysql_query("SELECT * FROM `Messages` WHERE `Namereason` = 'name' OR Nametaker='name'");
  5.  
  6.         while ($row = mysql_fetch_assoc($rs))
  7.             {
  8.                         if($row['Nametaker']<>"name")
  9.                             {
  10.                                 $x=$row['Nametaker'];
  11.                                 }
  12.                                  else
  13.                                   {
  14.                                    $x=$row['Namereason'];
  15.                                    }
  16.                     if(!array_key_exists($x,$rows))
  17.                                 {
  18.                  $i = $i + 1;
  19.                  $rows[$x]=1;
  20.                 }
  21.             }
  22. echo $i;
  23.  
  24.  
  25.  

Всегда пожалуйста! Я лишь подкинул логическую мысль)
(Добавление)
Slavenin пишет:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(id) AS count FROM TABLE WHERE name = 'vasya' OR name2 = 'vasya' GROUP BY name

Данный код будет считать все id (даже повторяющиеся), если я не ошибаюсь
10. Slavenin - 18 Июня, 2011 - 14:10:08 - перейти к сообщению
как id может повторяться о_О тогда это не айдишник а хрень, и считает он количество строк
если нужно количество сообщений то можно использовать формулу sum()
11. Coder1994 - 18 Июня, 2011 - 14:11:33 - перейти к сообщению
Slavenin пишет:
как id может повторяться о_О тогда это не айдишник а хрень, и считает он количество строк
если нужно количество сообщений то можно использовать формулу sum()

мы имеем дело с таблицой сообщений, там ид пользователей могут повторятся столько же, сколько сообщений отправили юзеры друг другу.
12. Slavenin - 18 Июня, 2011 - 14:23:24 - перейти к сообщению
а при чем здесь id пользователя? о_О любая таблица должна иметь индекс по уникальному полю, его я как раз и подразумевал

а код должен выглядеть не так, а вот так
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT sum( d.c ) AS numRow
  2. FROM (
  3. SELECT count( `ID` ) AS c
  4. FROM `table` AS a
  5. WHERE `name1` =1
  6. UNION ALL
  7. SELECT count( `ID` ) AS c
  8. FROM `table` AS b
  9. WHERE `name2` =4
  10. ) AS d

 

Powered by ExBB FM 1.0 RC1