[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Цикл вопросов по запросах POSTGRES
daemon
Здравствуйте
Продолжаю цикл вопросов по поводу postgreSQl

У меня есть запрос

SQL
SELECT name, max(Id) as Id ,max(short_description) AS short_description, max(full_description) AS full_description, max(type) AS type FROM catalog WHERE parent = '10' AND visible = 'true' AND name LIKE '% %' AND type = 1 GROUP by name ORDER BY name ASC OFFSET 0 LIMIT 30


Нужно чтоб он сортировал выборку по name, к сожалению оно не так.
Какие ваши советы по данной ситуации ?



Спустя 10 минут, 15 секунд (15.07.2009 - 22:56) sergeiss написал(а):
Цитата (daemon @ 15.07.2009 - 23:45)
к сожалению оно не так

Встречный вопрос: а "как оно", что происходит? Как выстраиваются выбранные данные?

PS. И еще. У parent какой тип - строка или целое?

Спустя 14 минут, 46 секунд (15.07.2009 - 23:10) daemon написал(а):
ну структура базы впринцыпе не важна, важно только то те 4 поля у выборке (name, short_description, full_description, type, Id), я не знал как сделать выборку (нужно чтоб запросе фигурировала GROUP by ) к сожалению чтоб в начала запроса , после SELECT , вставить поле для выборке его нужно также было вставлять и GROUP by , но группировка должна быть только по name.
Далее parent - целое число.

В идеале нужно сделать таблицу ( на PHP ) с полями name, short_description, full_description, type, Id , но в таблице не должны повторяться name, должна быть группировка.

Спустя 7 минут, 17 секунд (15.07.2009 - 23:18) sergeiss написал(а):
Я не понял - тебе нужно сделать выборку или тебе нужно изначально таблицу с уникальными значениями name???
И почему обязательно должен быть GROUP BY? Уникальные name можно выбрать другими средствами.

Кстати. На ПХП ты не сделаешь таблицу, ты ее сделаешь всё равно в Постгре. Это небольшое примечание к вопросу терминологии smile.gif

Спустя 2 минуты, 39 секунд (15.07.2009 - 23:20) daemon написал(а):
Цитата
Кстати. На ПХП ты не сделаешь таблицу, ты ее сделаешь всё равно в Постгре. Это небольшое примечание к вопросу терминологии


Это я знаю.
Цитата

И почему обязательно должен быть GROUP BY?


Не обязательно, но это желательно.

Цитата
Я не понял - тебе нужно сделать выборку или тебе нужно изначально таблицу с уникальными значениями name???


И то и другое, но другое ближе к тому что я хочу

Спустя 3 минуты, 57 секунд (15.07.2009 - 23:24) sergeiss написал(а):
Вот смотри. Если у тебя есть несколько строк с одинаковыми name, и ты хочешь выбрать уникальные name, то что делать с другими полями, которые ты выбираешь? Они могуть быть произвольно взятыми от любой строки с этим name, или с ними надо что-то проделать (сумма, максимум или еще что-то)?

Я к тому спрашиваю, что тут, по-моему, всё просто делается smile.gif Только ты сначала дай более полные данные.

Спустя 1 минута, 49 секунд (15.07.2009 - 23:26) daemon написал(а):
Цитата
Вот смотри. Если у тебя есть несколько строк с одинаковыми name, и ты хочешь выбрать уникальные name, то что делать с другими полями, которые ты выбираешь? Они могуть быть произвольно взятыми от любой строки с этим name, или с ними надо что-то проделать (сумма, максимум или еще что-то)?


Ну пусть будет максимальное Id ( это не важно ), главное чтоб в результате не повторялись name

Спустя 8 минут, 27 секунд (15.07.2009 - 23:35) sergeiss написал(а):
ОК. Используем distinct, но так, чтобы уникальными были именно name, и больше ничего. В Постгре это очень даже хорошо работает, а в MySQL это достигается другими средствами.
Вот твой запрос (только я убрал условие "name like '% %'" как непонятное для меня)
SQL
select distinct on (name ) name, id, short_desctiption, full_description, type
from catalog where parent=10 and visible=true and type=1
order by name
limit 30


В результате этого запроса будут выбраны 30 записей, удовлетворяющих указанным условиям, при этом из каждой группы с одинаковыми name будет взята только одна строка. Какая именно - можно регулировать через order by. Если предположить, что для каждого name существует несколько записей в БД, то тогда разные сортировки будут давать разные данные:
SQL
order by name, id -- вариант 1
order by name, id desc -- вариант 2
order by name desc, id, short_descrition -- вариант 3

Вариантов тут много... Что укажешь, то и будет работать.

Спустя 24 минуты, 54 секунды (15.07.2009 - 23:59) daemon написал(а):
отлично, группировка уже есть, спасибо за это
Но возникла еще одно проблемка, нужно сортировка по тому же name

SQL
select distinct on (name ) name, id, short_description, full_description, type
from catalog where parent='10' and visible='true' and type='1'
order by name asc offset 0 limit 30


Запрос не сортирует

Спустя 15 минут, 13 секунд (16.07.2009 - 00:15) sergeiss написал(а):
Быть того не может, чтобы не сортировало! Там же указана сортировка по name, указана в явном виде.
Покажи тут список name, в том порядке, как они у тебя выводятся.

Спустя 18 часов, 50 минут, 59 секунд (16.07.2009 - 19:06) daemon написал(а):
даю пример выборки, в примере только поля name, так как другие не важны
Итак:
    Ежова Ира
    Вайханские Галина и Борис
    Дальний свет
    Беляев Константин
    Бандера Андрей
    Гена Богданов
    Егоров Вадим
    Егоров Андрей
    Дворовые песни
    Дворовые песни нашего века
    Данилин Владимир / Кузнецов Алексей / Ростоцкий Алекс
    Банников Иван
    Евстигнеев Александр
    Весь шансон на MP3
    Бачурин Евгений
    АВТОритетный - 4
    Автомобильный
    Вахнюк Борис
    Грач Гера
    Грач Гера, Бумер
    Драгилев Борис
    Грановский Гурам
    Время наших песен
    Время наших песен - 4
    Время новых песен
    Братья Жемчужные

К сожалению
SQL
ORDER BY name ASC

не помогло =((

Спустя 2 часа, 49 минут, 35 секунд (16.07.2009 - 21:55) sergeiss написал(а):
Я даже не знаю, что и сказать, кроме того, что этого не может быть....
Хорошо. Ты мне можешь дать эту БД целиком, сделав ее бэкап? Что-то я не верю в чудеса. Скорее всего, что-то там "не так".

Спустя 33 минуты, 10 секунд (16.07.2009 - 22:28) daemon написал(а):
ну, если честно база целиком весит 400 Mb
вот посмотри http://live-shop.ru/new/catalog.php?view=10

Спустя 22 минуты, 11 секунд (16.07.2009 - 22:51) sergeiss написал(а):
Хорошо... У тебя получается, что идет какая-то смесь, которая не в алфавитном порядке...

А описание таблицы покажи. Может, тут что не так, как надо?

Кстати. Ты там показываешь запрос smile.gif А в нем стоит условие
SQL
AND name LIKE '% %'
Попробуй убрать его! Я вообще его смысл не понимаю, если честно. Ты хочешь выбрать строки, где есть пробел? Это можно сделать по-другому немного.

У меня в тестовой базе с этим условием были выбраны все текстовые строки. Хотя там вообще пробелов нету.

Спустя 6 минут, 5 секунд (16.07.2009 - 22:57) daemon написал(а):
SQL
AND name LIKE '% %'


если честно, я сам не понимаю, но без него вообще выборка по первым 30 не идет..

Цитата
А описание таблицы покажи. Может, тут что не так, как надо?

    id SERIAL,
    name varchar(255) NOT NULL default '',
    short_description text NOT NULL,
    full_description text NOT NULL,
    parent integer NOT NULL default '0',
    type integer NOT NULL default '0',
    price float NOT NULL default '0',
    quantity varchar(10) NOT NULL default '',
    visible varchar(255) NOT NULL default 'true',
    newid varchar(255) NOT NULL default 'false',
    best varchar(255) NOT NULL default 'false',
    art varchar(255) NOT NULL default '',
    recommended text NOT NULL,
    availability varchar(255) NOT NULL default 'true',
    only_order varchar(255) NOT NULL default 'false',
    brandname varchar(255) NOT NULL default '',
    oldprice float NOT NULL default '0',
    bestseller varchar(255) NOT NULL default 'false',
    bonus_price integer NOT NULL default '0',
    pday varchar(255) NOT NULL default 'false',
    isyml varchar(255) NOT NULL default 'true',
    weight float NOT NULL default '0',
    propertygroup integer NOT NULL default '0',
    position integer default '999',
    ozon_id integer NOT NULL default '0',
    metadesc varchar(255) NOT NULL,
    metakeys varchar(255) NOT NULL,
    metaalt varchar(255) NOT NULL,
    ww integer default '0'

это структура базы ( если надо )

Спустя 16 минут, 6 секунд (16.07.2009 - 23:13) sergeiss написал(а):
А попробуй вот что... Замени имя этого поля с name на всё, что угодно другое. Например, name_. Похоже, ты просто "попал" на зарезервированное слово.

У меня в тестовой таблице я заменил имя колонки с field2 на name и тоже начались некоторые "чудеса"... И выкини это условие LIKE '% %'!!!!!!

Спустя 19 минут, 3 секунды (16.07.2009 - 23:32) daemon написал(а):
угу, взял по Id, и вуаля , все работает))
Но, проблемка все-таки с name, мне ж нужно чтоб сортировка была по name =((
не заменять ж мне везде name, где оно только встречаться ( это тоже идея, но не хотелось бы так глубоко ковыряться )

Спустя 8 минут, 29 секунд (16.07.2009 - 23:40) sergeiss написал(а):
Придется заменить... Тогда всё должно быть нормально.

Спустя 2 минуты, 59 секунд (16.07.2009 - 23:43) daemon написал(а):
ну хорошо, спасибо, без вас бы эту ( примитивную и в той же час тупуЮ!!! ) ошибку не нашел бы =) cool.gif

Спустя 10 часов, 30 минут, 29 секунд (17.07.2009 - 10:14) sergeiss написал(а):
Ну так что - заменил? Это же не долго, любой текстовый редактор позволяет сделать поиск и замену smile.gif. Если подойти к этому процессу "с умом", то ошибок не будет и займет вся процедура очень немного времени.

Спустя 2 часа, 35 минут, 18 секунд (17.07.2009 - 12:49) daemon написал(а):
да, согласен, это недолго
Но сама база занимает - 400 Мб, а таблица 300 (смысле дамп).

Если бы был какой-нить запрос с помощью которого можно было бы заменить поле name на fullname, или может быть он и существует ?

Спустя 34 минуты, 47 секунд (17.07.2009 - 13:24) sergeiss написал(а):
Я думал, у тебя проблема заменить name на name_ в скрипте...

В БД это сделать не просто, а очень просто smile.gif Да и в тексте скриптов ненамного сложнее

ALTER TABLE - "то, что доктор прописал" для изменения имени поля в таблице:
SQL
ALTER TABLE catalog
RENAME name TO fullname

Спустя 53 минуты, 22 секунды (17.07.2009 - 14:17) daemon написал(а):
да, и в скрипте тоже, но нужно сначала чтобы была сортировка, а так как name зарезервировано - это проблематично и потому нужно так же заменить name на, скажем, fname )

Спустя 1 час, 17 минут, 17 секунд (17.07.2009 - 15:35) daemon написал(а):
как ни банально но сортировка была корректна только по цифрам и английским буквам...
Вывод:
- сортировка некорректная только с русскими буквами ))

Когда я взял сортировку по Id - все работало, но когда взял обратно по fname ( оновленое name ) - обстановка снова повторилась.
Что делать дальше ? wink.gif


Спустя 4 часа, 58 минут, 24 секунды (17.07.2009 - 20:33) daemon написал(а):
Еще одно, у меня локальном хосте стоить Denwer вместе с аддоном postgreSQL.
Как не странно но там все отображаться нормально ( по алфавиту ), напрашиваться только единственный вывод - что-то не так с выделенным сервером ( подразумеваю что нужно где то что-то редактировать ) но что - не знаю.

Кодировка базы как на лок хосте так и на серве одна - WIN1251. Скрипт как на лок хосте так и на серве один.

Что нужно делать дальше))?

P.S. Запрос абсолютно корректно работает ( спасибо за помощь ), но как всегда у меня неможыть все и сразу работать нормально и поэтому всегда появляться ошибки

Спустя 1 час, 34 минуты, 25 секунд (17.07.2009 - 22:07) sergeiss написал(а):
Даже и не знаю, что посоветовать, куда копать...

Единственный, до конца не ясный для меня вопрос smile.gif Убрал ли ты то странное условие с LIKE?

Спустя 14 минут, 23 секунды (17.07.2009 - 22:22) daemon написал(а):
да оно принципе не важно, важно лишь то ( насколько я понял ) что сервер настроенный неверно, а как его настроить я незнаю =((
может вы знакомы с настройками серверов:?

Спустя 36 минут, 16 секунд (17.07.2009 - 22:58) daemon написал(а):
может хоть что-то? )
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.