Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471

Не получается сделать корректную выборку из БД

07.10.2016, 08:38. Показов 1183. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте форумчане. Требуется помощь.
Есть таблица со списком ЛС пользователей.
Структура:
SQL
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE IF NOT EXISTS `LS` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `usernameFrom` VARCHAR(255) NOT NULL DEFAULT '', - имя пользователя от кого письмо
  `useridFrom` INT(11) NOT NULL, - id пользователя от кого письмо
  `text` mediumtext NOT NULL, - текст сообщения
  `usernameFor` VARCHAR(100) NOT NULL, - имя пользователя кому письмо
  `useridFor` INT(11) NOT NULL, - id пользователя кому письмо
  `dateAdd` datetime NOT NULL, - дата добавления
  `new` INT(1) NOT NULL, - прочитанное или нет
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;
Хочу составить запрос таким образом, чтобы при входе в ЛС, выдавало список всех диалогов.
Т.е каждого пользователя с кем есть переписка. Только его логин, без переписки. Переписка появляется при выборе пользователя из списка.

Сначала пробовал сделать запрос так:
PHP
1
$lsInfo = $sql->run("select usernameFrom,useridFrom from `".MY_PREFIX."_LS` where useridFor = ? GROUP BY useridFor",array($_SESSION['ID']));
Но в таком виде диалог покажет только если мне было сообщение, а если я пользователю писал то в списке диалогов пользователь не появится.

Прошу помощи как корректно сделать выборку.
Список всех диалогов по одному разу, неважно от меня письмо пользователю или от пользователя мне или и то и другое.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.10.2016, 08:38
Ответы с готовыми решениями:

Не получается сделать выборку из БД
ООП только со вчерашнего дня изучаю. Решил попробовать перевести код подключения к базе в ООП. Не получается сделать выборку. ...

Не получается сделать выборку из таблицы БД
Здравствуйте! Создаю значит проект веб-сайта на C# в VS 2012(беру дефолтный шаблон). Прикрепляю бд AdventureWorks, все по инструкции: ...

PDO не получается сделать выборку из MySQL
Не так давно изучаю ООП и PDO пишу класс для соединения с базой. Ошибки не выдает но и выборки тоже не делает. private $_db; ...

10
94 / 94 / 68
Регистрация: 26.03.2015
Сообщений: 248
07.10.2016, 08:58
Лучший ответ Сообщение было отмечено MirDj как решение

Решение

Я бы сделал две выборки SELECT и объединил их оператором UNION:
SQL
1
2
3
4
5
6
7
8
9
10
11
SELECT r.name, r.id
FROM (
SELECT usernameFrom AS name, useridFrom AS id
    FROM LS
    WHERE useridFor=1
UNION
SELECT usernameFor AS name, useridFor AS id
    FROM LS
    WHERE useridFrom=1
) AS r
ORDER BY r.id;
1
 Аватар для BearBaloo
41 / 41 / 16
Регистрация: 04.10.2016
Сообщений: 154
07.10.2016, 09:01
Сложно ответить на такой вопрос, не совсем понятно как лежат там данные, и когда записываются)
Могу предположить что вам нужно получать имена пользователей но выборку делать и для
SQL
1
useridFor
и для
SQL
1
useridFrom
тоесть чтобы выбирались и ваши сообщения кому то.

SQL
1
SELECT DISTINCT usernameFrom,useridFrom  FROM `".MY_PREFIX."_LS` WHERE useridFor = 1 AND useridFrom = 1
Дистинкт для подстраховки)
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
07.10.2016, 09:07  [ТС]
Цитата Сообщение от BearBaloo Посмотреть сообщение
тоесть чтобы выбирались и ваши сообщения кому то.
Да, чтобы и мои кому-то, но отображался ник не мой естественно, а ник пользователя кому я писал, т.е с кем диалог.
И не очень понятно
Цитата Сообщение от BearBaloo Посмотреть сообщение
useridFor = 1 AND useridFrom = 1
Это что? Ведь здесь id пользователя либо кто писал, либо кому написали.

Добавлено через 3 минуты
Цитата Сообщение от ns16 Посмотреть сообщение
Я бы сделал две выборки SELECT и объединил их оператором UNION:
А где тут запрос именно на список МОИХ диалогов? Меня идентифицирует
PHP
1
$_SESSION['ID']
Не увидел этого запроса. И опять же смутили
Цитата Сообщение от ns16 Посмотреть сообщение
WHERE useridFrom=
и
Цитата Сообщение от ns16 Посмотреть сообщение
WHERE useridFor=1
Откуда там единица?
0
 Аватар для BearBaloo
41 / 41 / 16
Регистрация: 04.10.2016
Сообщений: 154
07.10.2016, 09:11
Еденица, это айди пользователя вы туда должны подставить сессию свою...

Если верить логике которая предлагается в таблице, то написанные ОТ тебя сообщения должны быть помечены как
SQL
1
 useridFrom= $_SESSION['ID']
Поэтому тебе нужно получить и то и то. И там нужен не
SQL
1
AND
а
SQL
1
OR
моя ошибка)
0
94 / 94 / 68
Регистрация: 26.03.2015
Сообщений: 248
07.10.2016, 09:19
Цитата Сообщение от MirDj Посмотреть сообщение
Откуда там единица?
Это значение для примера, подставьте вместо него идентификатор вашего пользователя.
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
07.10.2016, 09:22  [ТС]
Цитата Сообщение от BearBaloo Посмотреть сообщение
Поэтому тебе нужно получить и то и то.
Но в таком варианте он разве не выдаст список диалогов столько раз, сколько есть сообщений между мной и пользователем? И да, а как сделать отображение имя пользователя всегда того с кем переписка. Ведь при выборке
SQL
1
SELECT DISTINCT usernameFrom,useridFrom
Он будет выдавать в одном случае мой ник, если я писал сообщение, а в другом случае ник того, кто мне написал.

Добавлено через 2 минуты
Цитата Сообщение от ns16 Посмотреть сообщение
Это значение для примера, подставьте вместо него идентификатор вашего пользователя.
Да, понял... Спасибо. В вашем варианте запроса ник и id для вывода будет уже в виде name и id? И там всегда будет имя того с кем диалог? А не тот от кого сообщение?
0
94 / 94 / 68
Регистрация: 26.03.2015
Сообщений: 248
07.10.2016, 09:33
Цитата Сообщение от MirDj Посмотреть сообщение
В вашем варианте запроса ник и id для вывода будет уже в виде name и id?
Да.
Цитата Сообщение от MirDj Посмотреть сообщение
И там всегда будет имя того с кем диалог? А не тот от кого сообщение?
Там будут имена тех пользователей, с которыми у текущего пользователя есть переписка. Лучше попробуйте выполнить мой код и сами все увидите
0
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
07.10.2016, 13:05  [ТС]
Цитата Сообщение от ns16 Посмотреть сообщение
Лучше попробуйте выполнить мой код и сами все увидите
Спасибо, именно этим сейчас и занят. Обязательно отпишусь по результату

Добавлено через 10 минут
ns16, Спасибо, вроде бы все работает так как надо.

Добавлено через 3 часа 17 минут
В процессе разработки столкнулся с еще одной проблемой.
Окно переписки, там работает ajax запрос на обновление данных.
Открываю от двух пользователей переписку и пытаюсь написать друг другу.
Все это работает, но при обновлении данных использую запрос вида
SQL
1
$ls_sql = $sql->run("select * from ".MY_PREFIX."_LS where date_format(dateAdd,'%Y%m%d%H%i%s')> ? and (useridFor = ? and useridFrom = ?) or (useridFor = ? and useridFrom = ?)",array($_REQUEST['updDate'],$_SESSION['ID'],$_REQUEST['UserId'],$_REQUEST['UserId'],$_SESSION['ID']));
Как мне кажется что он корректный
"Вывести все сообщения, которые старше даты $_REQUEST['updDate'] и где пользователь для кого сообщение равно $_SESSION['ID'] и при этом отправитель $_REQUEST['UserId'] или где наоборот Для кого сообщение это $_REQUEST['UserId'] а отправитель $_SESSION['ID']".

Но при обновлении данных каждый раз выводится полный список сообщений.
Если оставляю только условие по дате, то все работает как надо, но тогда будет выдавать и от других диалогов сюда письма. А если условие добавляю про пользователей, то каждый раз все выводятся... Не могу понять в чем дело....
0
94 / 94 / 68
Регистрация: 26.03.2015
Сообщений: 248
07.10.2016, 13:31
MirDj, возьмите условия (useridFor=? and useridFrom=?) or (useridFor=? and useridFrom=?) в круглые скобки так, чтобы получилось ((useridFor=? and useridFrom=?) or (useridFor=? and useridFrom=?)). Должно помочь.
1
3 / 3 / 2
Регистрация: 16.01.2013
Сообщений: 471
07.10.2016, 13:36  [ТС]
ns16, Действительно помогло... Спасибо. Ведь думал же об этом, но почему-то так и не попробовал пока совет не дали
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.10.2016, 13:36
Помогаю со студенческими работами здесь

Не получается сделать выборку за неделю за месяц за год
Привет всем. Ребят не получается сделать выборку за неделю, за месяц, за год. Я много статей и примеров посмотрел. Не могу правильно...

Не могу сделать выборку уже мучаюсь 2 дня и не получается
Здравствуйте Помогите пожалуйста сделать выборку, вроде написано все верно а не работает в массив попадает куча всего, хотя на...

JPA. Не получается сделать выборку последних 10 записей отсортированную по Type
Не получается сделать выборку последних 10 записей отсортированную по Type import javax.persistence.Column; import...

Сделать возможной корректную обработку 2 ситуаций
Добрый день возникла проблема в обработке двух разных ситуаций при создании калькулятора с унарными и бинарными операциями. В первой...

Не получается запрос на выборку
Нужно сделать фильтр по контрагентам в форме "Реестр договоров". Делаю запрос к таблице "Реестр договоров" с условием отбора по...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru