Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите написать SQL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Без описания
new01
Отправлено: 18 Июня, 2011 - 12:45:30
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




Вот есть таблица с сообщениями.Поля "Отправитель" и " Получатель". Вот сижу и не могу додуматься как сделать SQL запрос,который посчитал коли-во переписок с одним пользователем. Т.е. написал пользватель name пользователю user 5 сообщений и пользователь user написал пользователю name 2 сообщения -- это одна переписка,переписка пользователя , переписка пользователя name с пользователем user. Как сделать такой SQL запрос ? Заранее спасибо.

(Отредактировано автором: 18 Июня, 2011 - 12:56:21)



-----
new01
 
 Top
Coder1994
Отправлено: 18 Июня, 2011 - 12:48:22
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




PHP:
скопировать код в буфер обмена
  1. $rows = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name' AND `poluchatel` = 'user5'")->num_rows;

(Отредактировано автором: 18 Июня, 2011 - 12:48:47)

 
 Top
new01
Отправлено: 18 Июня, 2011 - 12:55:22
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




Coder1994 пишет:
$rows = $db->query("SELECT * FROM `table1` WHERE `sender` = 'name' AND `poluchatel` = 'user5'")->num_rows;

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


-----
new01
 
 Top
Slavenin
Отправлено: 18 Июня, 2011 - 12:58:00
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




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

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



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




Slavenin пишет:
какой вопрос такой ответ... непонятна структура таблицы и что собственно нужно посчитать

Хорошо объясняю ещё раз.
Есть таблица с двумя полями:"Отправитель","Получатель". Есть пользователь name. Мне надо посчитать кол-во польвзаотелей,с которыми он переписывался.
Привожу пример.
Name отправил 3 сообщения пользователю user.User отправил 5 сообщений name.Name отправил 4 сообщения User1 .User1 отправил 3 сообщения name.В данном случае получается,что name ввёл две переписки(прошу обратить внимание на слово переписки,просто вдумайтесь в него!). С пользователями User и User1.


-----
new01
 
 Top
Coder1994
Отправлено: 18 Июня, 2011 - 13:25:47
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




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.  

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

(Отредактировано автором: 18 Июня, 2011 - 13:41:48)

 
 Top
Slavenin
Отправлено: 18 Июня, 2011 - 13:58:44
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




CODE (SQL):
скопировать код в буфер обмена
  1. SELECT count(id) AS count FROM TABLE WHERE name = 'vasya' OR name2 = 'vasya' GROUP BY name

(Отредактировано автором: 18 Июня, 2011 - 14:01:15)

 
 Top
new01
Отправлено: 18 Июня, 2011 - 13:59:21
Post Id



Посетитель


Покинул форум
Сообщений всего: 301
Дата рег-ции: Июнь 2010  
Откуда: Челябинск


Помог: 1 раз(а)




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. Хотелось бы так.)

(Отредактировано автором: 18 Июня, 2011 - 14:01:21)



-----
new01
 
 Top
Coder1994
Отправлено: 18 Июня, 2011 - 14:01:13
Post Id


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




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 (даже повторяющиеся), если я не ошибаюсь
 
 Top
Slavenin
Отправлено: 18 Июня, 2011 - 14:10:08
Post Id



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




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


Частый гость


Покинул форум
Сообщений всего: 213
Дата рег-ции: Май 2010  
Откуда: Россия, Ростов-на-Дону


Помог: 3 раз(а)




Slavenin пишет:
как id может повторяться о_О тогда это не айдишник а хрень, и считает он количество строк
если нужно количество сообщений то можно использовать формулу sum()

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



Посетитель


Покинул форум
Сообщений всего: 285
Дата рег-ции: Май 2010  
Откуда: Тверь


Помог: 4 раз(а)




а при чем здесь 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

(Отредактировано автором: 18 Июня, 2011 - 14:24:04)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с СУБД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB