[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Последний правильный вариант
asstral
Добрый день ребята!
Не могу составить запрос.
Есть пользователи они могут заходить и выходить в группы. Примерно как в вк.
В таблички я сохраняю их действия, виду историю.

user posted image

Что мы имеем, последние записи говорят нам, что пользователь с номером 22 зашёл в группу 8 (project_id) (access=2) вышел (access=4) и опять зашёл (access=2). Но он может выйти и значит, что последнее действие (access=4) и он не состоит в группе.

Собственно, как мне узнать по запросу, какие номера пользователей в группе 8(project_id=8 зашли и не выходили или выходили но последнее действие был вход?
waldicom
Может легче перенести/оставить историю в отдельной таблице, а актуальную группу хранить при пользователе (в таблице где данные пользователь записаны)?

_____________
Свои мозги еще никто не отменял.
Телепатов нету.
Kusss
SELECT 
ass.access, ass.user_id
FROM
(
SELECT
id, access, user_id
FROM
`ass_project_user`
WHERE
`project_id` = 8
GROUP BY
user_id,
id DESC
) AS ass
WHERE
ass.access != 4
Но что-то меня берут сомнения.
вот был бы дамп, тогда запрос будет рабочий.
Kusss
waldicom
только нужна отдельная таблица, в которой будет группа/пользователь/статус
asstral
waldicom, Kusss да, так можно, но это последний вариант.

Kusss немного отредактировал, возможно это имелось в виду:

SELECT 
ass_project_users.access, ass_project_users.user_id
FROM
(
SELECT
id, access, user_id
FROM
`ass_project_user`
WHERE
`project_id` = 8
GROUP BY
user_id,
id DESC
) AS ass_project_users
WHERE
ass_project_users.access != 4


Но выводятся несколько раз один и тот же к примеру пользователь 22, который несколько раз заходил и выходил.
Kusss
SELECT 
ass_project_users.access, ass_project_users.user_id
FROM
(
SELECT
id, access, user_id
FROM
`ass_project_user`
WHERE
`project_id` = 8
GROUP BY
user_id
ORDER BY
id DESC
) AS ass_project_users
WHERE
ass_project_users.access != 4
Kusss
в подзапросе выбираем последнюю запись каждого пользователя.
в следующем убираем из неё отписавшихся.
asstral
Kusss, почему-то пользователь с id 1 вообще пропадает и никаких действий.
Другие пользователи выводятся, но не реагирует на выход.

Решено, но через костыль с php

$qq='SELECT * FROM ass_project_user WHERE project_id=8 GROUP BY user_id';
$rres = mysql_query($qq);
$n=0;
while ($ss = mysql_fetch_array($rres)){
$n++;
$qqq = 'SELECT * FROM ass_project_user WHERE user_id = '.$ss['user_id'].' AND project_id=8 ORDER BY id DESC LIMIT 1';

$rrres = mysql_query($qqq);
if ($sss = mysql_fetch_array($rrres)){

if ($sss['access'] == 2) {
$this->bb_user($ss['user_id']); // ВЫВОДИМ ПОЛЬЗОВАТЕЛЯ
}
}
}


Посредством php получилось.
А можно объеденить эти два запроса в один?
1. SELECT * FROM ass_project_user WHERE project_id=8 GROUP BY user_id
я ищу уникальных пользователей (user_id) принадлежащие группе (project_id)
2. SELECT * FROM ass_project_user WHERE user_id = '.$ss['user_id'].' AND project_id=8 ORDER BY id DESC LIMIT 1
нахожу последние действие пользователя.
3. Если последние действие (access=2) был вход, то вывожу.

Игорь_Vasinsky
Цитата
while ($ss = mysql_fetch_array($rres)){
    $n++;
    $qqq = 'SELECT * FROM ass_project_user WHERE user_id = '.$ss['user_id'].' AND project_id=8 ORDER BY id DESC LIMIT 1';

бля**, есть контакт.



_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Kusss
Цитата (asstral @ 24.04.2017 - 15:04)
почему-то пользователь с id 1 вообще пропадает и никаких действий.

потому что пользователь 1 отписался в строке id = 10

мой запрос должен был выводить всех пользователей подписанных на "группу".
waldicom
Цитата (Kusss @ 24.04.2017 - 10:40)
только нужна отдельная таблица, в которой будет группа/пользователь/статус

эммм...
Цитата (waldicom @ 24.04.2017 - 10:33)
историю в отдельной таблице


_____________
Свои мозги еще никто не отменял.
Телепатов нету.
asstral
Kusss
Я немного поменял действия 1-го пользователя. теперь последние по id - это access = 2, что значит, что пользователь в группе.

user posted image

Но Ваш запрос, его не видит.

user posted image

SELECT ass_project_user.id, ass_project_user.access, ass_project_user.user_id
FROM (

SELECT id, access, user_id
FROM `ass_project_user`
WHERE `project_id` =8
GROUP BY user_id
ORDER BY id DESC
) AS ass_project_user
WHERE ass_project_user.access =2


Мне не очень нравятся id, он должен отталкиваться по последним, а не первым.
после WHERE ass_project_user.access =2 ORDER BY id DESC не помогает
AllesKlar
asstral
Ты делаешь плохо. Очень плохо!!! Не делай так никогда.
waldicom тебе уже сказал, как будет правильно.
Цитата
Может легче перенести/оставить историю в отдельной таблице, а актуальную группу хранить при пользователе (в таблице где данные пользователь записаны)?


В независимости от того, таблица ли это или функция, или класс, все должно быть предназначенно для одной и только одной вещи/действия/сущности.
Иначе у тебя будет бардак, неразбериха, баги и проклятья от других разработчиков :)

Итак, у тебя есть:
- пользователи
- группы
- лог

Вот и делай три таблицы:
- user
- group
- logs

ну, и связи между ними
- user_group

Юзер зашел в группу, ты создал соответсвующую запись в user_group
Юзер вышел из группы, ты удалил соответсвующую запись из user_group
Паралельно кидаешь evets в таблицу logs

И тогда твой запрос на тему
Цитата
Собственно, как мне узнать по запросу, какие номера пользователей в группе 8(project_id=8 зашли и не выходили или выходили но последнее действие был вход?
превращается в элегантное
select * from user 
left join user_group on (user.id = user_group.user_id)
where user_grouр.group_id = 8


Нужна статистика? Читай таблицу logs

А при твоей нынешней структуре, я присяду на недельку и буду 26 часов в сутки входить/выходить в/из группу.
У тебя твоя таблица распухнет и твой запрос с каждым днем будет все медленнее и медленнее. И однажды скрипт просто по таймауту умрет.

_____________
[продано копирайтерам]
asstral
AllesKlar
Спасибо всем за помощь!
Создам отдельную таблицу, и гемора будет меньше.
Быстрый ответ:

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