| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > 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;
Выводит: obj1 Name1 name2 name3 Name1 А надо obj1 Name1 name2 name3 И что бы было name 1 у которого максимальная дата из всех name1 |
| Автор: Wolf1994 11.4.2012, 12:15 | ||
GROUP BY u.d_name, как и в MySQL должен помочь:
Если не поможет, разбить на два простых запроса, если сложность - не принципиальна. |
| Автор: Aliance 11.4.2012, 12:40 | ||
должно помочь Раздел вопроса думаю выбран не верно. |
| Автор: 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
|
| Автор: supercelt 11.4.2012, 21:10 | ||
Может я и неправильно сделал, но при этом ошибка 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 |
| все поля оптимизировать будете, когда потребуется. для начала решите задачу хоть как-то |