Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737 Форумы портала PHP.SU :: Mysql PostgreSql PDO бекап [3]
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
3d_killer пишет:
но как тут можно вытащить все поля таблицы pre_core_group.*
Отдельным запросом
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
MiksIr
Отправлено: 26 Марта, 2016 - 22:23:46
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
Постгрес нынче умеет не требовать агрегатных функций при группировке по праймари ключу. Это и используй.
----- self-banned
OrmaJever
Отправлено: 26 Марта, 2016 - 22:56:55
Активный участник
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
MiksIr постре не требудет агрегатных функций если в селекте только групируемое поле, это кстати не зависит от pk, но вот если нужно вытащить из таблицы что-то еще, кроме групируемого поля, а так зачастую и бывает, то нужно использовать агрегатные функции, после мускуля это очень не привычно и иногда даже странно, но это верно.
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
MiksIr
Отправлено: 27 Марта, 2016 - 01:11:49
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
OrmaJever
Если у нас джойн одной таблицы на другую, и группировка по первичному ключу одной из таблиц - поля этой таблицы можно использовать без агрегата
Цитата:
select p.name,count(c.*) from product p left join constants c on p.id=c.product_id group by p.id;
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
3d_killer ой не, в коде нужно выбрать одну бд, если писать код и под мускуль и под постгрес то говнокод получится ибо иногда запросы сильно отличаются. (Добавление)
MiksIr пишет:
группировка по первичному ключу одной из таблиц
Я сидел, думал, думал, а потом понял что группировка по первичкому ключу не имеет смысла, он ведь всегда уникален. То есть count каждой группы всегда будет 1. Поэтому таких запросов я просто не встречал и врядли встречу, но в остальных случаях нужно использовать агрегатные функции
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
MiksIr
Отправлено: 27 Марта, 2016 - 13:50:32
Забанен
Покинул форум
Сообщений всего: 378
Дата рег-ции: Сент. 2014
Помог: 10 раз(а)
[+]
OrmaJever пишет:
Поэтому таких запросов я просто не встречал и врядли встречу,
Группировка по первичному ключу нужна для использования агрегатных функций в связанной таблице один-ко-многим. Я даже пример привел про это. Т.е., когда тебе, например, нужен юзер и число его коментариев - группировка по id юзера позволит достать его данные. Выглядит вполне логично, но долго время постгрес не давал это сделать.
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
3d_killer пишет:
Соответственно, при запросах на выборку выходит очень много Left Join, на небольшом объеме данных все хорошо, но пробовал рендомно накидать объектов под 200 тыс, это превращается в ад, запросы по 15-30 секунд.
А может дело в самих запросах ?
На вскидку:
как поступит MySQL в случае с LEFT JOIN, а как в случае INNER JOIN ?
При грамотной архитектуре БД + грамотно составленных запросах, связывания отличные от INNER JOIN - крайне редко необходимы.
200т. для MySQL это много ? Серьёзно ?
Рекомендую, на прощанье с MySQL, открыть для себя (может, всё же, пригодится когда-нибудь) неплохую "книжку".
Касаемо различных СУБД: у каждой, в той или иной мере, свои сильные и слабые стороны.
Кроме самих данных и относительной структуры (лишь для ясности) ничего больше не нужно.
Тоже помаленьку осваиваю "Слоника".
Только не по причине проблем с производительностью I/O xxx тыс. записей...
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
armancho7777777 я не спорю для mysql это не много, просто помимо хотелось бы изучить и постгри и тут выяснились неприятности, то что привык делать так это по правилам построения запросов нельзя (не уверен, но возможно, что неправильное построение запросов влечет за собой лишние тормоза)
На данный момент я закончил с переходом и вобщем доволен, а именно проект может работать как на MYSQL так и на постгри
у PG вместо уникального индификатора выступают последовательности, нарушение которых дает возможность дублирования этих самых уникальных индификаторов что не приятно, сразу этого не узрел и после переноса при добавлении новых позиций база поехала, сначало не понял в чем дело, когда нашел пришлось дописывать в переносе текущий максимальный ID, так же PG ругается если пришел неверный формат данных, то есть надо все контролировать на уровне PHP, IF там нет!, но есть CASE который работает и в MYSQL
группировка и DISTINCT довольно требовательны к правильности построения.
В целом не жалею о полученном опыте, с Mysql конечно же не прощаюсь ибо много проектов работают на нем, на большей части хостов нет пока PG (Добавление)
а и от кавычек удалось избавиться в названии таблиц удалив тот самый "-" в названии, теперь при смене подключения база сразу заводится хоть с PG хоть с MySQL (Добавление)
armancho7777777 пишет:
как поступит MySQL в случае с LEFT JOIN, а как в случае INNER JOIN ?
это как бы разные вещи, данных по какому либо параметру может не быть, но в выборку объект попасть должен просто с этими параметрами NULL, INNER JOIN выкинет объект из выборки (Добавление) OrmaJever ну у меня в проекте кода который работает на постгри и при этом не работает на MySQL не оказалось помимо дат методы которые описывал выше (Добавление)
может просто пока не было таких запросов
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
MiksIr пишет:
Группировка по первичному ключу нужна для использования агрегатных функций в связанной таблице один-ко-многим. Я даже пример привел про это. Т.е., когда тебе, например, нужен юзер и число его коментариев - группировка по id юзера позволит достать его данные. Выглядит вполне логично, но долго время постгрес не давал это сделать.
А вот теперь я понял о чем ты. Да этот вариант очень даже не плох
Я раньше подобные подсчеты делал вот так
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
3d_killer
Отправлено: 27 Марта, 2016 - 17:03:59
Участник
Покинул форум
Сообщений всего: 1916
Дата рег-ции: Апр. 2011 Откуда: Ростов-на-Дону
Помог: 21 раз(а)
OrmaJever, ну вот вариат который ты привел первым так и описывается в документации, второй вариант я не видел и на сколько понял он используется в последних версиях PG, хотя он вполне логичен
Покинул форум
Сообщений всего: 7540
Дата рег-ции: Янв. 2010 Откуда: Чернигов
Помог: 299 раз(а)
я только что попробовал несколько своих запросов переписать под групировку по PK, и результаты странные, где-то группировка по PK быстрее в 2 раза, где-то хуже в 10 раз. Так что тут надо смотреть по ситуации
----- Если вы хотя бы 3-4 раза не решите всё выкинуть и начать заново - вы явно что-то делаете не так.
armancho7777777
Отправлено: 27 Марта, 2016 - 19:26:15
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
3d_killer пишет:
это как бы разные вещи, данных по какому либо параметру может не быть, но в выборку объект попасть должен просто с этими параметрами NULL, INNER JOIN выкинет объект из выборки
Вопрос был не "Какой будет результат".
armancho7777777 пишет:
как поступит MySQL в случае с LEFT JOIN, а как в случае INNER JOIN ?
Перефразирую в лоб:
какой запрос выполнится быстрее ?
С LEFT JOIN или INNER JOIN, и почему ?
А так же: почему LEFT, а не INNER в Вашем случае ?
Потому как:
armancho7777777 пишет:
При грамотной архитектуре БД + грамотно составленных запросах, связывания отличные от INNER JOIN - крайне редко необходимы.
$query.=" INNER JOIN ".PDB."core_group_to_user ON ".PDB."core_group_to_user.id_user=".PDB."core_users.id AND ".PDB."core_group_to_user.id_group = :group";
а параметры вытаскиваются для вывода через LEFT (Добавление)
у меня таблица объектов, таблица типов объектов, таблица связи (тип - объект), таблица параметров, таблица с вариантами значений параметров (если тип параметра выбирается из списка) и таблица со значениями параметров или ссылками на них к конкретному объекту
armancho7777777
Отправлено: 27 Марта, 2016 - 19:47:17
Активный участник
Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011 Откуда: Москва
Помог: 221 раз(а)
Если правильно понял, у Вас там EAV-модель.
В MySQL 5.7 присутствует поддержка работы с JSON, что добавит возможность более удобно и оптимально, на мой взгляд, реализовать логику хранения данных.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.