Вообщем пришёл к такому мнению, что ORM это хорошо, но слишком сильно влияет на производительность, нагружает машину. Поэтому хочу совершенствовать свои силы в написании SQL запросов "руками". Эта тема что то типа опроса. Если вам есть что сказать, напишите как и где вы тренируетесь в составлении sql запросов, ваши советы.
Верный вывод из неверного постулата. Обсуждать "производительность" ОРМ лень, а запросы руками уметь писать нужно. Вот тебе две задачи. 1. Есть посты и теги к постам. Отношение многое ко многим т.е. у поста может быть любое число тегов, или не быть тегов вообще. Выбери все посты, у которых _нет_ тега "SQL". 2. Очень полезная задача. Есть тема и у нее есть посты. Нужно получить для каждой темы ID самого раннего поста (т.е. первого поста). Сами ID перемешаны как угодно, и вообще будем считать, что в качестве ID используется UUID4. Обе задачи нужно сделать без вложенных подзапросов, т.е. чисто с использованием JOIN без каких-то подзапросов.. --- Добавлено --- Он просто посты набивает
выбрать записи у которых есть несколько тегов, при этом не должно быть некоторых тегов и некоторые теги могут быть, а могут и не быть и там где они есть такие должны быть вверху (в начале списка)
Это прозвучит банально, тренеруюсь в PhpMyAdmin/. Часто использую для форматирования sql-запроса прежде чем выожить на форум.
это очень удобно. но один хрен сложные запросы приходится писать руками. А простые можно и руками написать. Я считаю что орм это чистой воды вкусовщина.
С ОРМ ничего не мешает писать сложные запросы руками. Ну нужно смешивать построитель запросов и идею ОРМ.
Ну я поступаю так: там где простые запросы на выборку, там очень удобно ORM. Там где ручной запрос быстрее работает, там составляю руками. В любом случае, чтобы пользоваться нормально ORM, надо уметь и руками писать. Highload я не пишу, поэтому большого снижения производительности от ORM не наблюдаю. ORM удобно тем, что можно в любом порядке задавать любые части запроса. У меня в одном проекте через несколько подсистем проходит ORM-объект, прежде чем превратиться в запрос (для реализации фильтров, к примеру). Грубо говоря, есть хранилище объявлений, которое умеет выбирать объявления. Но как фильтровать - она не знает. А как фильтровать знает модуль фильтрации. Просто хранилище перед тем, как сделать запрос, посылает событие, на которое подписан модуль фильтрации, и добавляет нужные условия. Вот с обычным запросом такое было бы реализовать более трудоёмко (хотя, в WordPress, в принципе, реализовано, но в виде отдельных событий на where, на limit, на join)
Тут я бы сделал так SELECT `posts`.* FROM `posts` AS po INNER JOIN `pivot` AS pi ON `pi`.`post_id` = `po`.`post_id` INNER JOIN `tags` AS ta ON `pi`.`tag_id` = `ta`.`tag_id` WHERE `ta`.`tag_id` NOT IN ('SQL'); Тут единственное что пока пришло мне в голову, это объеденить таблицы `theme` и `posts` и использовать условие WHERE `theme`.`id` = $theme_id AND `posts`.`timestamp` = MIN(`posts`.`timestamp`); Без поля времени, вторую точно не решу сам
Если у поста два тега, SQL и PHP, то связь на PHP удовлетворит условию NOT IN ('SQL') и этот пост окажется в выборке. А не должен. Так ты сделай тестовую таблицу и попробуй. Это у тебя условие на минимальное время по всей таблице постов. А не для темы.
ОРМ имеет свои минусы и плюсы конечно имеет. Иначе бы не было ОРМ никаких. Разницы почти нет, кроме вкусового удобства. Вы применяете те же штуки к запросу, что руками, что через стрелочку. Большим бонусом будет ещё возможность передать запрос-объект в другой метод, где на него можно навесить условия и прочее, не заботясь о последовательности. А оно само потом отрендерится в правильный запрос. Но я так не делаю никогда, не сталкивался с такой необходимостью. Стараюсь сводить всё к простым методам и простым запросам, стараюсь избегать джоинов.
Мне кажется он сам вообще на заходит на форум. Такое чувство что это бот. Сколько он на форуме, никогда не видел чтобы он обращался к человеку или отвечал на обращение к себе.
MiksIr, вот смотри я создал первую таблицу http://sqlfiddle.com/#!9/6e347 и вторую http://sqlfiddle.com/#!9/0b481 , если направишь меня я попробую написать запросы
По первому - попробуй сначала с подзапросом хотя бы сделать. Потом я покажу как с джойном это красиво сделать. А по второму - гугли В написании запросов это важно. Тем более это заставит тебя разбирать найденные примеры в интернете, что бы понять - то или не то.
Вот мой новый небольшой эксперимент, не знаю правильно, нет SELECT `p`.`id` FROM `theme` AS `t` INNER JOIN `posts` AS `p` ON (`p`.`theme_id` = `t`.`id` AND `p`.`timestamp` = MIN(`p`.`timestamp`) ) WHERE `t`.`id` = $tid Вот это я если честно не понял, про какую связь идёт речь
Это может и будет работать, если все посты начинаются с одного времени Но если в одной теме самый ранний пост - позавчера, а в другой - вчера, то равенство с min не будет срабатывать. --- Добавлено --- Связь на тег "PHP". Если у поста два тега, то второй тег будет проходить проверку NOT IN ('SQL') ... и в итоге эта тема попадет в выборку, хоть у нее и есть тег SQL