Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > составить сложный запрос на пхп к postgre


Автор: supercelt 10.4.2012, 23:57
Здравствуйте. Помогите пожалуйста составить запрос. Есть таблицы

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

Автор: Wolf1994 11.4.2012, 12:15
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';


Если не поможет, разбить на два простых запроса, если сложность - не принципиальна.

Автор: Aliance 11.4.2012, 12:40
Код

group by d_name having max(date)

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

Раздел вопроса думаю выбран не верно.

Автор: supercelt 11.4.2012, 18:46
Выводит ошибку

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... ^

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

date даёт ошибку только в этом примере? Попробуйте экранировать для различия с типом "date".

Автор: supercelt 11.4.2012, 19:35
Других примеров у меня нет, так что только в этом и единственном. Поставил 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 что ли нужен

Автор: baldina 11.4.2012, 20:40
ясно же сказано - требуется boolean. а max(date) - типа date
Код

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

Автор: supercelt 11.4.2012, 21:10
Код

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' Что бы это значило

Автор: baldina 11.4.2012, 21:32
в group by должны быть перечислены все поля, которые не входят в агрегатные функции. раз указано d.*, то придется все поля перечислять

Автор: supercelt 11.4.2012, 22:59
Прошу прощения, по запарке совсем забыл, нужно вывести не только поля 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

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


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

оптимизировать будете, когда потребуется. для начала решите задачу хоть как-то

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)