За последние 24 часа нас посетили 20674 программиста и 1008 роботов. Сейчас ищут 449 программистов ...

Оптимизация запроса SQL

Тема в разделе "MySQL", создана пользователем Павел Голубцов, 22 июн 2019.

  1. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Имеем 2 таблицы:
    1 - user: c полями: id, username
    2 - post: с полями: id, username_id, post, full_post
    Задача получить данные (страница статьи) с данными:
    ЗАГОЛОВОК = post,
    КТО АВТОР = username_id => username,
    СТАТЬЯ = full_post,

    Необходимо выполнить 2 запроса для этого в данном случае.

    Вопрос можно как то это привести к одному запросу ?
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    LEFT JOIN

    Хотя смотря в какой ситуации: для страницы конкретной статьи можно и два запроса.
    --- Добавлено ---
    P.S. LEFT JOIN в списках статей, выбираемых не по автору, будете использовать.
     
  3. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    А если добавить еще таблицу:
    user_life: с полями: (id, username из таблицы => user), (username_id из таблицы => post)
    и в бушующем может еще с какими таблицами делать связки, например комментарии
    и брать КТО АВТОР из нее что бы не задействовать таблицу user. ?
     
  4. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    @Павел Голубцов пожалуйста будь менее абстрактным. Есть ощущение, что ты оптимизируешь то, чего нет.

    Покажи подалуйста структуру таблиц в виде SQL: как CREATE TABLE и минимальный набор тестовых данных.
    http://sqlfiddle.com/ или https://www.db-fiddle.com/
    --- Добавлено ---
    P.S. Пока что твой вопрос не содержит даже намёка на PHP. Переношу тему.
    --- Добавлено ---
    @miketomlin почему ты советуешь LEFT JOIN ? Любопытно.
     
  5. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @artoodetoo, пушто там 2 таблицы связанные по id пользователя, поэтому LEFT JOIN
     
  6. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    То есть у тебя всегда LEFT, когда есть связь?
    --- Добавлено ---
    Это неправильно. Открытое (т.е. внешнее left|right outer join ) соединение должно быть обоснованным.
     
    Maputo нравится это.
  7. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    @artoodetoo, автор не указал "есть связь двух табов"
     
  8. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ребята, left outer join для тех случаев, когда ты выводишь посты и внезапно может оказаться, что у поста нет автора, но пост надо вывести всё равно.

    По умолчанию используют закрытое (внутреннее, inner join) соединение, при котором косячные связи не выведутся.

    Поэтому повторю вопрос: почему left, что к этому подвигло?
    --- Добавлено ---
    @Павел Голубцов https://ru.m.wikipedia.org/wiki/Join_(SQL)
     
  9. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Я не постил что поддерживаю приставки к JOIN в данном случае
     
  10. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Ну сорри тогда, показалось. Как молчаливая поддержка ;)
     
  11. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @artoodetoo, мне любопытно, почему нет? См.
    Если имеются какие-то опасения, связанные с отсутствием автора, для этого есть спец. техники. Или ты предлагаешь не выбирать статью в отсутствие автора? ОК, если есть на то основания, добавляйте спец. условие в запрос. Я таких оснований не увидел. Обычное присоединение к статье метаданных автора.
     
  12. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Тогда добавь еще на всяк. случай таблицу dragon_death :) Хочешь лишить пользователей потенциала когда-нибудь стать авторами? Для такого простого разделения ролей можно без доп. таблицы обойтись. А если вводить ее, то явно не так, как ты придумал. И вообще конкретно имена обычно не нормализуются. Сделай просто user_id (uid, user). Можно и слово author использовать (комментирующие пользователи – тоже в каком-то смысле авторы).
     
  13. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Сложнее всего доказывать очевидное :) outer join это особый случай объединения, а не наоборот.
    --- Добавлено ---
    Но я не буду разбиваться в говно доказывая это. Если тебе нравится везде писать left, пиши на здоровье. У меня только один вопрос: а ты когда-нибудь писал right join? :)
     
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Согласен с обоими утверждениями.

    Везде??? :)

    Возможно, когда-то и писал. Но у меня есть товарищи, которые помогли навести порядок в этом деле.
     
  15. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @artoodetoo, может, ты попутал с inner join, задавая последний вопрос?
     
  16. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Это если связь есть
    PHP:
    1. SELECT * FROM post JOIN user USING( username_id )
    Иначе
    PHP:
    1. SELECT post.*, user.username FROM post JOIN user ON user.id = post.username_id
     
  17. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Спасибо за пищю для размышлений.
    Пришла мысль заменить в таблице post: поле username_id на username.
    Так как создавать смогут только зарегистрированные пользователи и брать из $_SESSION['user'] значение для username в запрос на создание записи в таблицу POST.
    С подводными камнями не столкнусь ?
     
  18. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    столкнешься.
    PHP:
    1. SELECT post.*, user.username nickname FROM post JOIN user ON user.id = post.username
     
  19. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    какие камни? у тебя базовых знаний ноль, это равносильно тому, что ты прыгаешь в пустой бассейн... камней там тоже нет
    в ленте попалась статья на глаза https://rb.ru/opinion/ne-programmist/
     
    MouseZver нравится это.
  20. MouseZver

    MouseZver Суперстар

    С нами с:
    1 апр 2013
    Сообщения:
    7.748
    Симпатии:
    1.321
    Адрес:
    Лень
    Код (Text):
    1. влюбленность в дело (если человек в жизни не написал ни единой строчки кода для себя, потому что нравится, — вряд ли он является программистом);

    @miltorg , прям про тебя
     
  21. Павел Голубцов

    Павел Голубцов Активный пользователь

    С нами с:
    4 мар 2019
    Сообщения:
    183
    Симпатии:
    4
    Сидит такой и думает какой я умный все другие дебилы, как же мне хорошо, высрал крик души полегчало !