[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Сообщения и БД
nasferatu
Пишу скрипт для отправки личных сообщения на сайте. Я это понимаю так, создал таблицу, где поля от кого, кому, сомо сообщение, дата отправки и также поле для определения прочитано оно или нет (например, 0 - прочитано, 1 - нет). Верна ли такая структура???
Если да, то:
PHP
$dbmysql_query("SELECT *, COUNT(*) AS number FROM messenger WHERE user_to='$login'");

этот запрос подсчитывает общее кол-во сообщений, но как посчитать в этом же запросе и кол-во непрочитанных сообщений??? Или для этого необходим второй запрос делать????



Спустя 9 минут, 50 секунд (15.03.2009 - 18:57) twin написал(а):
Ну как можно одновременно сидеть и стоять? Запрос вернет или все записи , или те, которые удовлетворяют условию. Он же не разорвется... И вот тут SELECT *, COUNT не надо *, если просто нужно к-во записей.

Спустя 23 минуты, 45 секунд (15.03.2009 - 19:20) Viking написал(а):
если надо только подсчитать количество, то что-то типа:
select count(*) from ТАБЛЯ where user_to='$login' union all select count(*) from ТАБЛЯ where ПРОЧИТАНО=0 and user_to='$login';

Спустя 1 час, 59 минут, 43 секунды (15.03.2009 - 21:20) nasferatu написал(а):
twin, технологии на месте не стоят, вдруг я где-то что-то упустил и можно уже одновременно и стоять и сидеть smile.gif SELECT *, COUNT - тут еще я пытаюсь и получить значения
Viking, нужен еще и вывод.
select *, count(*) from ТАБЛЯ where user_to='$login' union all select count(*) from ТАБЛЯ where ПРОЧИТАНО=0 and user_to='$login'
не прокатит???

Спустя 46 минут, 52 секунды (15.03.2009 - 22:07) Viking написал(а):
не прокатит
если у тебя ПРОЧИТАНО только 0 и 1 то в принципе можно что-то типа
select *, sum(ПРОЧИТАНО) as `read` from ТАБЛЯ where user_to='$login'
полное количество определаешь через mysql_num_rows() и вычтя из него то, что будет в read получишь количество непрочитанных
хотя это всеравно изврат, вроде был способ в последней строке сумму получать, тогда можно было бы сделать красивее, но я не помню как это

Спустя 14 минут, 25 секунд (15.03.2009 - 22:21) Viking написал(а):
не, это я кажется неправильно сказал
тебе вообще все строчки надо получать?

короче имхо проще двумя запросами сделать

Спустя 34 минуты, 43 секунды (15.03.2009 - 22:56) twin написал(а):
Самое смешное в этой ситуации, что усложнение запроса не дает никакой выгоды в производительности перед двумя или больше. Правда если они написаны грамотно. А получить мухи и котлеты в одной тарелке конечно можно, если сильно постараться, только будет ли это вкусно...

Спустя 6 минут, 13 секунд (15.03.2009 - 23:02) nasferatu написал(а):
вот это я и хотел узнать smile.gif
значит делаем два запроса. Пасиб, за внимание

Спустя 23 минуты, 18 секунд (15.03.2009 - 23:25) bret написал(а):
А разве не нужно уникальное поле вроде айди мессаги7

Спустя 9 минут, 47 секунд (15.03.2009 - 23:35) nasferatu написал(а):
bret, конечно, оно есть, но в рассматриваемой ситуации оно пока не нужно

Спустя 15 часов, 1 минута, 13 секунд (16.03.2009 - 14:36) sergeiss написал(а):
Можно и одним запросом получить очень много разной информации. Точнее, это будет один сложный запрос, состоящий из нескольких запросов.
Только я не совсем понял, что же именно ты хочешь сделать? Получить одновременно, и сумму прочитанных и непрочитанных сообщений? Можно, если очень нужно smile.gif
SQL
select *,
(select count(*) from _table_ where условие_на_прочитанные) as were_red,
(select count(*) from _table_ where условие_на_непрочитанные) as were_not_red
from _table_ where и_еще_условие_какое_нужно

Спустя 1 час, 35 минут, 31 секунда (16.03.2009 - 16:12) nasferatu написал(а):
sergeiss, но на сколько я уже понял, в данном случае один запрос не оправдает себя, я не выиграю ничего этим. Но за запрос спасибо, пригодится в другом месте smile.gif

Спустя 14 минут, 4 секунды (16.03.2009 - 16:26) sergeiss написал(а):
Запрос не оправдает себя - это точно smile.gif Но сделать за один запрос можно, тем не менее. Начальный запрос об этом был? smile.gif

А вообще, я стараюсь по максимуму сделать в SQL-запросе, а не в коде ПХП-скрипта. Так, по-моему, надежнее получается. И должно быть и быстрее, в случае серьезных (больших) БД.
Да и нагляднее, наверное. Пусть бы даже 3-4-5 уровней вложенности присутствует.

Спустя 12 минут, 15 секунд (16.03.2009 - 16:38) twin написал(а):
Цитата
И должно быть и быстрее, в случае серьезных (больших) БД.
Да и нагляднее, наверное.
По первому точно нет, а второе - спорный вопрос. Все таки сложный синтаксис новичкам особенно сложнее дается. smile.gif

Спустя 9 минут, 29 секунд (16.03.2009 - 16:48) sergeiss написал(а):
Насчет "по первому точно нет" (насчет скорости)... Не очевидно это. Потому что одно дело, что ты сделал какую-то выборку, загрузил ее в массивы и начал крутить-вертеть. Идут затраты времени на резервирование памяти, на запись данных туда, на какую-то обработку этих данных.
В БД происходит, по сути, всё тоже самое, только после интерпретации запроса работает скомпилированное ядро БД (насколько я понимаю "физику процесса").
В скрипте же постоянно идет интерпретрация текста, которая (по определению) медленнее, чем работа скомпилированной программы.
Так что насчет однозначности я лично не буду утверждать smile.gif

А насчет синтаксиса сложного... Не так он и сложен, если его разделить на составляющие части smile.gif Надо только приноровиться, да писать запрос так, чтобы он был четко структурирован визуально. Пусть учатся, кому надо.

Спустя 37 минут, 19 секунд (16.03.2009 - 17:25) Viking написал(а):
обработка данных в БД по определению происходит быстрее, чем в пхп, причем на порядки, по этому все что можно лучше делать в одном запросе, другое дело, что выигрышь в милисекунды не всегда того стоит

Спустя 21 минута, 45 секунд (16.03.2009 - 17:47) sergeiss написал(а):
Иногда и секунды, и десятки можно выиграть, в сложных запросах smile.gif

Например, у меня БД со статитстикой. Много объектов, по каждому объекту есть данные за каждый час, и много данных. В некоторых таблицах несколько строк относятся к одному объекту.
В итоге в некоторых таблицах за пару месяцев скапливаются данные в количестве под полмиллиона-миллиона записей. А общий объем БД - несколько гигов.
Там даже "select count(*) from..." происходит далеко не мгновенно.

Спустя 12 минут, 36 секунд (16.03.2009 - 17:59) Guest написал(а):
Учимся, конечно, будем учиться. Но сначала руку набьем запросами попроще.
Здесь выводить последние 5, но как заставить этот запрос получить еще и кол-во всех комментов???

PHP
$db mysql_query("SELECT commentary.id_news, commentary.commentary, commentary.date, news.name FROM commentary INNER JOIN news ON commentary.id_news=news.id WHERE commentary.login='$login' ORDER BY commentary.date DESC LIMIT 5");
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.