За последние 24 часа нас посетили 23565 программистов и 1522 робота. Сейчас ищут 830 программистов ...

Тренировка SQL

Тема в разделе "PHP для новичков", создана пользователем machetero, 22 май 2016.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вообщем пришёл к такому мнению, что ORM это хорошо, но слишком сильно влияет на производительность, нагружает машину. Поэтому хочу совершенствовать свои силы в написании SQL запросов "руками".
    Эта тема что то типа опроса.
    Если вам есть что сказать, напишите как и где вы тренируетесь в составлении sql запросов, ваши советы.
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    неужели ещё есть такие люди
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    igordata ты часто как то неоднозначно пишешь и сложно понять что ты имеешь ввиду
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Верный вывод из неверного постулата. Обсуждать "производительность" ОРМ лень, а запросы руками уметь писать нужно.
    Вот тебе две задачи.
    1. Есть посты и теги к постам. Отношение многое ко многим т.е. у поста может быть любое число тегов, или не быть тегов вообще. Выбери все посты, у которых _нет_ тега "SQL".
    2. Очень полезная задача. Есть тема и у нее есть посты. Нужно получить для каждой темы ID самого раннего поста (т.е. первого поста). Сами ID перемешаны как угодно, и вообще будем считать, что в качестве ID используется UUID4.

    Обе задачи нужно сделать без вложенных подзапросов, т.е. чисто с использованием JOIN без каких-то подзапросов..

    --- Добавлено ---
    Он просто посты набивает
     
  5. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    MiksIr сегодня не могу сделать, завтра попытаюсь и отпишусь
     
  6. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    выбрать записи у которых есть несколько тегов,
    при этом не должно быть некоторых тегов
    и некоторые теги могут быть, а могут и не быть и там где они есть такие должны быть вверху (в начале списка)
     
  7. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Это прозвучит банально, тренеруюсь в PhpMyAdmin/.
    Часто использую для форматирования sql-запроса прежде чем выожить на форум.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Обычно, кто на орм подсел, потом начинают всем в уши дуть, что без орм нынче нельзя. Врут.
     
  9. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Что такое орм? Мне и без него норм. Справляюсь как-то. По крайней мере с тем что мне нужно.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    это очень удобно. но один хрен сложные запросы приходится писать руками. А простые можно и руками написать.
    Я считаю что орм это чистой воды вкусовщина.
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    С ОРМ ничего не мешает писать сложные запросы руками. Ну нужно смешивать построитель запросов и идею ОРМ.
     
  12. SamyRed

    SamyRed Старожил

    С нами с:
    23 июл 2015
    Сообщения:
    1.196
    Симпатии:
    111
    Адрес:
    Украина
    Я так понимаю, лучше даже не разбираться что это такое, а то привыкну?))))
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Ну я поступаю так: там где простые запросы на выборку, там очень удобно ORM. Там где ручной запрос быстрее работает, там составляю руками. В любом случае, чтобы пользоваться нормально ORM, надо уметь и руками писать. Highload я не пишу, поэтому большого снижения производительности от ORM не наблюдаю.

    ORM удобно тем, что можно в любом порядке задавать любые части запроса. У меня в одном проекте через несколько подсистем проходит ORM-объект, прежде чем превратиться в запрос (для реализации фильтров, к примеру). Грубо говоря, есть хранилище объявлений, которое умеет выбирать объявления. Но как фильтровать - она не знает. А как фильтровать знает модуль фильтрации. Просто хранилище перед тем, как сделать запрос, посылает событие, на которое подписан модуль фильтрации, и добавляет нужные условия. Вот с обычным запросом такое было бы реализовать более трудоёмко (хотя, в WordPress, в принципе, реализовано, но в виде отдельных событий на where, на limit, на join)
     
  14. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Тут я бы сделал так

    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`);
    Без поля времени, вторую точно не решу сам
     
  15. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Если у поста два тега, SQL и PHP, то связь на PHP удовлетворит условию NOT IN ('SQL') и этот пост окажется в выборке. А не должен.
    Так ты сделай тестовую таблицу и попробуй. Это у тебя условие на минимальное время по всей таблице постов. А не для темы.
     
  16. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ОРМ имеет свои минусы и плюсы конечно имеет. Иначе бы не было ОРМ никаких.

    Разницы почти нет, кроме вкусового удобства. Вы применяете те же штуки к запросу, что руками, что через стрелочку. Большим бонусом будет ещё возможность передать запрос-объект в другой метод, где на него можно навесить условия и прочее, не заботясь о последовательности. А оно само потом отрендерится в правильный запрос.

    Но я так не делаю никогда, не сталкивался с такой необходимостью. Стараюсь сводить всё к простым методам и простым запросам, стараюсь избегать джоинов.
     
  17. Scogzhe

    Scogzhe Зэк
    [ БАН ]

    С нами с:
    4 фев 2015
    Сообщения:
    109
    Симпатии:
    0
    Пиши но это гемор
     
  18. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Гемор писать запрос? Ты о чем вообще?
     
    vayas нравится это.
  19. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    Он просто кидает везде одно сложные предложения, чтобы прорекламировать свою подпись.
     
  20. mahmuzar

    mahmuzar Старожил

    С нами с:
    6 апр 2012
    Сообщения:
    4.631
    Симпатии:
    425
    Адрес:
    РД, г. Махачкала.
    Мне кажется он сам вообще на заходит на форум. Такое чувство что это бот. Сколько он на форуме, никогда не видел чтобы он обращался к человеку или отвечал на обращение к себе.
     
  21. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    #21 machetero, 24 май 2016
    Последнее редактирование: 24 май 2016
  22. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    По первому - попробуй сначала с подзапросом хотя бы сделать. Потом я покажу как с джойном это красиво сделать.

    А по второму - гугли ;) В написании запросов это важно. Тем более это заставит тебя разбирать найденные примеры в интернете, что бы понять - то или не то.
     
  23. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    MiksIr хорошо буду пробовать и потом отпишусь
     
  24. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Вот мой новый небольшой эксперимент, не знаю правильно, нет
    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
    Вот это я если честно не понял, про какую связь идёт речь
     
  25. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Это может и будет работать, если все посты начинаются с одного времени ;) Но если в одной теме самый ранний пост - позавчера, а в другой - вчера, то равенство с min не будет срабатывать.
    --- Добавлено ---
    Связь на тег "PHP". Если у поста два тега, то второй тег будет проходить проверку NOT IN ('SQL') ... и в итоге эта тема попадет в выборку, хоть у нее и есть тег SQL