Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Мы в твиттере!
Мы вконтакте!
Мы на яндексе!

Краснодарское время: 25 Май, 2012, 01:12:49

Страниц: [1] 2
Печать
Автор Тема: Помогите составить запрос  (Прочитано 448 раз)
0 Пользователей и 1 Гость смотрят эту тему.
wats    ↓ 
05 Июль, 2011, 09:44:41
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Здраствуйте! Есть две таблицы: users и user_messages. Нужно подсчитать колличество новых сообщений для пользователя в таблице user_messages и вывести юзеров которые эти сообщения написали. То есть в итоге должно получится примерно так:

3 новых сообщения от Вася Пупкин
1 новое сообшение от Маша Пупкина

Таблица user_messages:
PHP

id // ид сообщения
from // ид того кто написал
to // ид того кому написали
message // сообщение
status // статус сообщения (1 - прочитано, 0 - не прочитано)
 

Таблица users стандартная, содержит данные юзеров.
 
Делал такой запрос:
PHP

SELECT `users`.*, (SELECT COUNT("user_messages.id") FROM user_messages WHERE user_messages.from = users.id AND user_messages.to = 5 AND user_messages.status = 0) AS `messages_count` FROM `users`
 
Выводит всех юзеров из таблицы users, а надо что бы только тех кто новые сообщения написал, знаю что в запросе еще наверно надо использовать join или group_by, но не знаю как правильно.
Записан

обычный web-мастер
Animator    ↓ 
05 Июль, 2011, 10:41:59 , спустя 57 минут 18 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5

что ты вообще не в теме...
не ужели этот запрос не выдает ошибку?
 
(SELECT COUNT("user_messages.id") - наверно так COUNT("user_messages.id") AS count_messages
 
и еще...
знаю что в запросе еще наверно надо использовать join или group_by, но не знаю как правильно.
правильно это когда в гугле пишешь - mysql join
лично мне первым результатом дало - http://www.mysql.ru/docs/man/JOIN.html
рекомендую
Записан
master    ↓ 
06 Июль, 2011, 02:13:16 , спустя 3 часа 31 минуту 17 секунд
НЕ ХУЕТА! ХУЕТА!

Квадратов сколько видишь ты?
Группа: Джедаи

Карма: 44
Сообщений: 2080
Сила слова: 2.12

SQL
SELECT `from`, count(`id`) AS `cnt` FROM `user_messages` GROUP BY `from`
по полю from желательно индекс построить
Записан

Animator    ↓ 
06 Июль, 2011, 11:28:13 , спустя 9 часов 14 минут 57 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5

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

по полю from желательно индекс построить
и по to и по status
Записан
wats    ↓ 
07 Июль, 2011, 03:30:21 , спустя 1 день 4 часа 2 минуты 8 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

не ужели этот запрос не выдает ошибку?
 
(SELECT COUNT("user_messages.id") - наверно так COUNT("user_messages.id") AS count_messages
не выдает, проверял в phpmyadmin
 
master, спасибо, выводит как раз ид того кто написал и сколько сообщений написал. Но вот к сожалению не знаю как здесь еще получить все данные написавшего из таблицы users. Подскажите пожалуйста.
Записан

обычный web-мастер
Animator    ↓ 
07 Июль, 2011, 03:32:42 , спустя 2 минуты 21 секунду
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5


джойнится все равно придется, что б имя пользователя вывести
Записан
wats    ↓ 
07 Июль, 2011, 03:51:57 , спустя 19 минут 15 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Animator, я понял что надо джойнится, но пока не знаю как правильно.
Вот master привел пример запроса, дак его надо использовать как подзапрос в основном запросе с джойном или нет?
Записан

обычный web-мастер
Animator    ↓ 
07 Июль, 2011, 04:01:20 , спустя 9 минут 23 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5

написать тебе готовый запрос?  
Спустя 40 секунд добавил

лично мне первым результатом дало - http://www.mysql.ru/docs/man/JOIN.html
Записан
wats    ↓ 
07 Июль, 2011, 04:09:00 , спустя 7 минут 40 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Animator, я знаю как делаются запросы с джойном, не знаю как сделать именно в этом случаи, хватит уже ссылку на мануал показывать.
Записан

обычный web-мастер
Animator    ↓ 
07 Июль, 2011, 04:27:34 , спустя 18 минут 34 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5


SQL

SELECT `from`, count(`id`) AS `cnt` FROM `user_messages` GROUP BY `from`

теперь разовьем тему:
SQL

SELECT `users.*`, count(`um.id`) AS `cnt` FROM `user_messages` AS `um` INNER JOIN `users` AS `u` ON `um.from` = `u.id` WHERE `um.to` = %айди получателя% GROUP BY `um.from`
 

пишу от руки, возможны опечатки, не обессудьте :)  
Спустя 3 минуты 28 секунд добавил
то есть, джойнишся по отправителю, а в условии фильтруешь по получателю, не забудь про индексы, и из таблицы users выгребай только то что нужно, потому как таблицы с сообщениями растут быстрее богатырей русских :)
ну и потом еще с портиционированием поэкспериментируй, хотя... это я уже больше себе на заметку :)
Записан
wats    ↓ 
07 Июль, 2011, 04:41:37 , спустя 14 минут 3 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Animator, спасибо, вот такой запрос тоже работает как надо, твой еще не тестил.
SQL

SELECT COUNT( "user_messages.id" ) AS cnt, users.id AS user_id, users.name AS user_name, users.email AS user_email
FROM user_messages
LEFT JOIN users ON users.id = user_messages.FROM
WHERE user_messages.TO =3
AND user_messages.STATUS =0
GROUP BY user_messages.FROM
 
Записан

обычный web-мастер
Animator    ↓ 
07 Июль, 2011, 04:46:40 , спустя 5 минут 3 секунды
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5

ай, молодец! справился таки сам :)
LEFT JOIN - тут зло, а в остальном наши запросі идентичні
и будь осторожнее с использованием названий типа - FROM
Записан
wats    ↓ 
07 Июль, 2011, 04:51:25 , спустя 4 минуты 45 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: -1
Сообщений: 142
Сила слова: -0.7

Animator, твой запрос тоже работает как надо
SQL

SELECT users . * , count( 'user_messages.id' ) AS cnt
FROM user_messages
INNER JOIN users ON user_messages.FROM = users.id
WHERE user_messages.TO =3
GROUP BY user_messages.FROM
 
Спустя 25 секунд добавил
спасибо за помощь )
Спустя 2 минуты 9 секунд добавил
твой запрос короче и получает все данные о пользователе из таблицы users)
Записан

обычный web-мастер
Animator    ↓ 
07 Июль, 2011, 04:53:53 , спустя 2 минуты 28 секунд
НЕ ХУЕТА! ХУЕТА!

Карма: 3
Сообщений: 200
Сила слова: 1.5

будь ласка :)
Записан
Sinkler    ↓ 
07 Июль, 2011, 05:59:34 , спустя 1 час 5 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!

Похуй, пляшем!
Группа: Джедаи

Карма: 73
Сообщений: 6806
Сила слова: 1.07

такой необычный разговор для местных краев)))
Записан

Страниц: [1] 2
Печать
 

Перейти в:  

Этот топик скрыли: NRG, adw0rd, mario