- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу

Зачем быть уникальным в мире, где все можно скопировать
Почему так важна уникальность текста и как она влияет на SEO
Ingate Organic

В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Имеем:
topics
tid - PRIMARY KEY
posts
pid - PRIMARY KEY
Как одним запросом присоединить к topics записи из posts с наибольшим pid?
Скиньте запрос на создание таблиц, чтобы не теоретизировать.
Если у Вас задача строго такая, как Вы поставили, то достаточно просто
select tid, max(pid) from topics left join posts on topics.tid=posts.topic_id group by topics.tid
Если же у Вас задача выбрать не просто max pid соответствующий топику, а выбрать еще дополнительные данные, то уточните задачу - какие поля выбирать и какая полная структура таблиц.
Если же у Вас задача выбрать не просто max pid соответствующий топику, а выбрать еще дополнительные данные
В общем случае - примерно так (сортируем по убыванию, группируем по нужному полю)
В общем случае - примерно так (сортируем по убыванию, группируем по нужному полю)
В Вашем запросе нет ничего говорящего о максимальном pid, поэтому именно для него вложенный вообще не нужен - вполне достаточно
SELECT t.*, p.* from topics t INNER JOIN posts p ON p.topic_id = t.tid
GROUP BY tid ORDER BY p.topic_id DESC
Но если мы правильно поняли Вашу мысль, то Вам нужно присоединить к таблице topics строку из posts с максимальным ID?
Тогда примерно так
p.s.: Последние сообщения пытаетесь выбрать с форума? Вообще принято при постинге в форум проставлять в таблицу тем номер последнего сообщения, тогда такие проблемы пропадают как класс.
В Вашем запросе нет ничего говорящего о максимальном pid
Ай-ай.. конечно же..
Во вложенном запросе сортировать по pid:
Ай-ай.. конечно же..
Во вложенном запросе сортировать по pid:
Вы вероятно полагаете, что в группу которую Вы делаете потом по tid попадает первая найденная строка из posts, поэтому сортировка вложенного запроса по pid выберет в результирующую таблицу строку с максимальным pid? Это ошибочная точка зрения. На самом деле в случае группировки не определено какая именно строка попадет в группу.
Поэтому приходится извращаться по типу запросов, что мы привели последним в предыдущем сообщбении.
Это ошибочная точка зрения. На самом деле в случае группировки не определено какая именно строка попадет в группу.
Первая попавшаяся ;) (а в данном случае - с максимальным pid т.к. мы точно знаем, какая строка будет первой для каждого tid в результате выполнения подзапроса)
Первая попавшаяся ;) (а в данном случае - с максимальным pid т.к. мы точно знаем, какая строка будет первой для каждого tid в результате выполнения подзапроса)
Не первая попавшаяся, а случайная попавшаяся:) mysql не определяет порядок выбора представителя группы если он не задан явно агрегирующими функциями.
В большинстве случае на большинстве текущих версий и конфигураций мускула - выборка будет та, которую Вы ожидаете, но не более того. Это даже более опасно, чем полагаться на выборку select * from table ожидая выборки по возрастанию автоинкримента.
Если же у Вас задача выбрать не просто max pid соответствующий топику, а выбрать еще дополнительные данные, то уточните задачу - какие поля выбирать и какая полная структура таблиц.
Да, присоединить со всеми остальными полями, не до конца наверное выразился. Поля и структура думаю особого значения не имеет, так как основная связь это t.tid=p.topic_id, остальное простые данные.
Типа того. Был бы последний ай-ди конечно бы вопроса не было.
У меня в итоге получился такой запрос
не знаю просто на сколько быстро отработает вложенный select max(pid)
В большинстве случае на большинстве текущих версий и конфигураций мускула
Пример "меньшинства" будет?
На самом деле не могу не согласиться по поводу "случайной" (да чего соглашаться, так в мануале и написано), т.к. для выбора неаггрегированных полей в запросах с GROUP BY используется порядок расположения записей "как есть" (да-да, из той же серии, что и автоинкремент), а они в общем случае не упорядочены (есть, правда, исключения)..
Однако, используя то, что при выборе используется первое из найденных значений в совокупности с заранее упорядоченным набором записей можно получить нужный результат. Вполне возможно, причина в том, что формулировка "indeterminate value" гораздо проще, чем попытка пояснить, почему та или иная запись будет первой..
* Поведение стабильное (больше 6-ти лет точно), логичное и оптимальное (с точки зрения минимизации операций) и я (лично для себя) не вижу никаких причин, по которым разработчики могли бы поменять его. Кому интересно - может заглянуть в код MySQL.
** Естественно, никого не призываю использовать =)
И да.. если 2 записи с максимальным pid, то в предложенном мной варианте, будет выбрано только одно.. то самое, "произвольное" (если не задать дополнительно приоритет)
mysql не определяет порядок выбора представителя группы если он не задан явно агрегирующими функциями.
А можно подробнее?