Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> составить сложный запрос на пхп к postgre 
:(
    Опции темы
supercelt
Дата 10.4.2012, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здравствуйте. Помогите пожалуйста составить запрос. Есть таблицы

Table ds

id   nazv
1    obj1
2    obj2

Table du
id   date                    time                       d_name         id_nazv
1    2010-04-04       23:38:22                  Name1            1
2    2010-05-12       14:56:32                Name2                     1
3    2011-06-23       14:24:23                Name3                     1
4    2012-04-04       05:23:25                  Name1                     1

Условие Есть входящая переменная id в ней ид объекта из табл ds по которому надо выбирать. Нужно вывести объект из ds, и имена из du которые соотв ds, но нужно что бы не было повторяющихся имён. И если 2 имени одинаковых нужно вывести то у которого максимальная дата(по дате и времени). Я составил запрос, ожнако он без группировки

$id = 1;

Код

$q = 'SELECT d.* AS ds, u.* AS du FROM ds AS d INNER JOIN du AS u ON d.id = u.id_nazv WHERE u.id_nazv = '.$id.' ORDER BY u.id';


Выводит:
obj1
Name1
name2
name3
Name1

А надо

obj1
Name1
name2
name3
И что бы было name 1 у которого максимальная дата из всех name1

Это сообщение отредактировал(а) supercelt - 10.4.2012, 23:58
PM   Вверх
Wolf1994
Дата 11.4.2012, 12:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



GROUP BY u.d_name, как и в MySQL должен помочь:

Код

$q = 'SELECT d.* AS ds, u.* AS du FROM ds AS d INNER JOIN du AS u ON d.id = u.id_nazv WHERE u.id_nazv = '.$id.' GROUP BY u.d_name ORDER BY u.id DESC';


Если не поможет, разбить на два простых запроса, если сложность - не принципиальна.
PM MAIL WWW   Вверх
Aliance
Дата 11.4.2012, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I ♥ <script>
****


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

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



Код

group by d_name having max(date)

должно помочь

Раздел вопроса думаю выбран не верно.
PM MAIL WWW ICQ Skype   Вверх
supercelt
Дата 11.4.2012, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Выводит ошибку

Warning: pg_query() [function.pg-query]: Query failed: ERROR: argument of HAVING must be type boolean, not type date LINE 1: ...des WHERE u.id_nazv = 1 GROUP BY u.d_name HAVING MAX(u.date... ^ in Z:\home\mozhayka.ru\www\script.php on line 7
Query failed: ERROR: argument of HAVING must be type boolean, not type date LINE 1: ...nazv WHERE u.id_nazv = 1 GROUP BY u.d_name HAVING MAX(u.date... ^
PM   Вверх
Wolf1994
Дата 11.4.2012, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Отсортируйте по id, если даты не обновляются - так быстрее.

date даёт ошибку только в этом примере? Попробуйте экранировать для различия с типом "date".
PM MAIL WWW   Вверх
supercelt
Дата 11.4.2012, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Других примеров у меня нет, так что только в этом и единственном. Поставил having max(u.id). Теперь такая ошибка

Query failed: ERROR: argument of HAVING must be type boolean, not type integer LINE 1: ...nazv WHERE u.id_nazv = 1 GROUP BY u.d_name HAVING MAX(u.id) ... ^ in 
Ему boolean что ли нужен

Это сообщение отредактировал(а) supercelt - 11.4.2012, 19:35
PM   Вверх
baldina
Дата 11.4.2012, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ясно же сказано - требуется boolean. а max(date) - типа date
Код

select max(date), d_name from ... group by d_name

PM MAIL   Вверх
supercelt
Дата 11.4.2012, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код

SELECT d.* AS ds, u.*, MAX(u.date) AS du FROM ds AS d INNER JOIN du AS u ON d.id = u.id_nazv WHERE u.id_nazv = '.$id.' GROUP BY u.d_name ORDER BY u.id DESC


Может я и неправильно сделал, но при этом ошибка

Query failed: ERROR: column "d.id" must appear in the GROUP BY clause or be used in an aggregate function LINE 1: SELECT d.* AS ds, u.*, MAX(u.date) AS du

Я пробовал подставлять в груп поочерёдно поля, вобщем ему надо что бы в груп были все поля из базы. Всвязи с этим рыл мануал и нашёл SET SQL_MODE = 'ONLY_FULL_GROUP_BY' Что бы это значило

PM   Вверх
baldina
Дата 11.4.2012, 21:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



в group by должны быть перечислены все поля, которые не входят в агрегатные функции. раз указано d.*, то придется все поля перечислять
PM MAIL   Вверх
supercelt
Дата 11.4.2012, 22:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Прошу прощения, по запарке совсем забыл, нужно вывести не только поля name, нужно вывести все поля. Результат должен содержать


id   nazv
1    obj1

id   date                    time                       d_name         id_nazv
2    2010-05-12       14:56:32                Name2                     1
3    2011-06-23       14:24:23                Name3                     1
4    2012-04-04       05:23:25                  Name1                     1

А так можно? перечислять все поля, не слишком емко? Нужно перечислить поля после селекта и в груп?


PM   Вверх
baldina
Дата 12.4.2012, 11:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



все поля
Цитата(supercelt @  11.4.2012,  22:59 Найти цитируемый пост)
не слишком емко

оптимизировать будете, когда потребуется. для начала решите задачу хоть как-то
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




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


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

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