Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Простейший запрос 
:(
    Опции темы
Suic2
Дата 11.10.2012, 15:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



mysql. Простейший запрос: найти в таблице пользователей, тех у которых 2 параметра равны определённому параметру.
Что может быть проще? Мучаюсь 3й день. Проблема в том что воспалённый индусский разум придумал таблицу от которой голова идёт кругом.
Официальное описание:
имеется таблица users, 
Код

- users - таблица с данными клиентов:
id        - id учетной записи клиента;
fio        - ФИО;
ну и куча всего ещё


более того имеются 3 таблицы с дополнительными данными клиентов (например номер паспорта, адрес):
Код

dopfields - содержит описания дополнительных полей:

 id        - идентификатор поля
 template_num    - номер шаблона
 parent_type    - с каким объектом ассоциируется поле. 0 - с клиентом
 field_type    - тип поля: целое, строковое, да/нет и т.д.
 field_name    - имя поля
 field_alias    - алиас имени
 field_flags    - строка флагов: убирать ли лидирующие/завершающие проблелы,
          включить транслитерацию, привести к нижнему регистру и т.д.
 field_template    - регулярное выражение для проверки корректности заполнения
          поля
 comment    - комментарий


Код

dopvalues - содержит данные дополнительных полей:

 parent_id    - хозяин данного параметра, например id абонента
 dopfield_id    - ссылка на описание параметра в таблице dopfields
          (по полю id)
 field_value    - значение параметра
 admin_id    - id администратора, внесшего/изменившего данные
 time        - timestamp создания/изменения данных
 revision    - номер ревизии, чем больше тем актуальнее

Для разных parent_id ревизия всегда разная. 

dopdata - объединение dopfields и dopvalues

Немного поясню про dopvalues. revision вычисляется так: в таблицу вставляется пустая запись, берётся id этой записи и далее записываются все дополнительные данные подряд, при этом всем им назначается revision равное этому числу.

Повторю задачу - найти пользователя у которого в данный момент(последняя(самая большая) ревизия) 2 параметра сохранённые в этих злополучных дополнительных полях равны определённому значению

PS: посылаю лучи ненависти автору этого безумия

Это сообщение отредактировал(а) Suic2 - 11.10.2012, 15:18
PM MAIL   Вверх
Akina
Дата 11.10.2012, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 45
Всего: 454



Tы имеешь, если я верно понимаю, иерархию (не по структуре таблиц!!! а по их наполнению)

user (1:N) revision (1:N) dop_parameter, dop_value

После разворачивания всего этого дерьма в плоскую таблицу (соотв. количество правильно накрученных join-ов) тебе надо просто отобрать записи, у которых пары (dop_parameter, dop_value) равны каким-то заданным там у тебя значениям, группировать их по юзеру и ревизии, отобрать (having) те, у которых count(distinct dop_parameter)=2, отсортирить по ревизии desc и взять limit 1 записей...




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Suic2
Дата 11.10.2012, 17:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



 smile не совсем понял что вы имели ввиду, но думаю это следствие того что конец рабочего дня
спасибо за ответ, завтра со свежей головой взгляну на ваш совет
PM MAIL   Вверх
Zloxa
Дата 11.10.2012, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Suic2 @  11.10.2012,  16:15 Найти цитируемый пост)
 воспалённый индусский разум

К сожалению наши соотечественники тоже не брезгливы к таким структурам.

Но вобще две задачи набившая оскомину уж. Срез последних + отбор по UDA

Цитата(Suic2 @  11.10.2012,  16:15 Найти цитируемый пост)
Повторю задачу - найти пользователя у которого в данный момент(последняя(самая большая) ревизия) 2 параметра сохранённые в этих злополучных дополнительных полях равны определённому значению

я прально понимаю, что parent_id это ссылка на user?

Озвучте чтоли платформу чтоли. На разных платформах решается по разному.
Если попытаться решить универсально, думаю, как-то так:
Код

select parent_id
from dopvalues dv
where dop_value = :dop_value1
  and dopfield_id = :dop_field1_id
  and not exists (select *  from dopvalues dvs where dvs.parent_id = dv.parent_id and dvs.dop_field_id = dv.dop_field_id and dvs.revision > dv.revision)
  and parent_id in (select parent_id
from dopvalues dv
where dop_value = :dop_value2
  and dopfield_id = :dop_field2_id
  and not exists (select *  from dopvalues dvs where dvs.parent_id = dv.parent_id and dvs.dop_field_id = dv.dop_field_id and dvs.revision > dv.revision)
)



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Suic2
Дата 12.10.2012, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



Да, parent_id это id из users. 
платформа mysql
спасибо за запрос, то, что надо:)

Это сообщение отредактировал(а) Suic2 - 12.10.2012, 10:04
PM MAIL   Вверх
Zloxa
Дата 12.10.2012, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 53
Всего: 161



Цитата(Suic2 @  12.10.2012,  10:54 Найти цитируемый пост)
mysql

Для MySQL для среза последних наверное лучше будет как то прикруть  limit вместо not exists
Но если то что надо, фиг с ним, пусть будет так smile


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Suic2
Дата 12.10.2012, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 36
Регистрация: 23.5.2012

Репутация: нет
Всего: нет



я в жизни не видел такой конструкции как not exists:) пойду гуглить что это такое, но mysql не заругался же на неё
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.