Medik 6 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 Сайт 21region.org Есть запрос: $sql = $db->query("SELECT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Который выбирает последние комментарии в новостях. В выборке есть одинаковые новости, с разными комментаторами. Как убрать дублирующие новости, что выбрались только уникальные последние новости, в которых появились комментарии. Спасибо. Цитата Ссылка на сообщение Поделиться на других сайтах
kang 42 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 В выборке есть одинаковые новости, с разными комментаторами. Как убрать дублирующие новости, что выбрались только уникальные последние новости, в которых появились комментарии. Отсюдова по-подробнее Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 Автор В выборке есть одинаковые новости, с разными комментаторами. Как убрать дублирующие новости, что выбрались только уникальные последние новости, в которых появились комментарии. Отсюдова по-подробнее Вот выборка этого запроса: Автобусы СССР → RedG21 Bard (ОГНИ) «КнИгА НеНорМальНого» (Двойной микстейп) → Karatel Тутанхамон погиб в... авиакатастрофе? → ZiCell Bard (ОГНИ) «КнИгА НеНорМальНого» (Двойной микстейп) → GOLD Американская семья полгода не приходила за выигрышем в ... → MaximV Метеостанция (21 фото) → MaximV Российский биатлонист выиграл золото Олимпиады-2010 → euGeniy MaximV-Beauty Sounds [Episode 007] 19.02.2010 → MaximV Slow-motion от канала Discovery → ZiCell MaximV-Beauty Sounds [Episode 007] 19.02.2010 → xatab Российский биатлонист выиграл золото Олимпиады-2010 → pups Метеостанция (21 фото) → fire Бокс-офис России за уик-энд 11.02-14.02.10 → andreika_shuler Григорий Ефимович Распутин (Новых) → aLexAndr Метеостанция (21 фото) → ZiCell В Махачкале грузовик врезался в рынок: 4 погибших → mpx Ускорение на льду 2010, Чебоксарский залив → ZiCell Российский биатлонист выиграл золото Олимпиады-2010 → BASON Так в Петербурге убирают снег → [DnB]JIocb Российский биатлонист выиграл золото Олимпиады-2010 → Vasilekk Тут есть повторы: По 2 раза: Bard (ОГНИ) «КнИгА НеНорМальНого» (Двойной микстейп) MaximV-Beauty Sounds [Episode 007] 19.02.2010 3 раза: Метеостанция (21 фото) и 4 раза: Российский биатлонист выиграл золото Олимпиады-2010 Нужно что было 20 последних новостей, в которых были комментарии. Сейчас имеется 20 последних комментариев, с указанием где был комментарий... Цитата Ссылка на сообщение Поделиться на других сайтах
kang 42 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 (изменено) Уже не помню как эта штука работала, но попробуйте так: $sql = $db->query("SELECT DISTINCT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Изменено 21 февраля 2010 пользователем kangalexey Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 Автор Уже не помню как эта штука работала, но попробуйте так: $sql = $db->query("SELECT DISTINCT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Так уже пробовал ранее. Повесил сайт... Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 GROUP by `comments`.`post_id` в конец поставьте перед лимитом и всё. Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 Автор GROUP by `comments`.`post_id` в конец поставьте перед лимитом и всё. Можно строку запроса? Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 (изменено) $sql = $db->query("SELECT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id GROUP by `comments`.`post_id` ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Попробуйте так. Изменено 22 февраля 2010 пользователем IT-Security Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 21 февраля 2010 Рассказать Опубликовано: 21 февраля 2010 Автор $sql = $db->query("SELECT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id ORDER BY comments.date DESC GROUP by `comments`.`post_id` LIMIT 0,".LIMITCOMM); Попробуйте так. MySQL Error! ------------------------ The Error returned was: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP by `comments`.`post_id` LIMIT 0,20' at line 1 Error Number: 1064 Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 22 февраля 2010 Рассказать Опубликовано: 22 февраля 2010 $sql = $db->query("SELECT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id GROUP by `comments`.`post_id` ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Попробуйте так. Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 22 февраля 2010 Рассказать Опубликовано: 22 февраля 2010 (изменено) Автор $sql = $db->query("SELECT comments.post_id, comments.is_register, comments.text, comments.autor, comments.email, post.id, post.date as newsdate, post.title, post.alt_name FROM " . PREFIX . "_comments as comments, " . PREFIX . "_post as post WHERE post.id=comments.post_id GROUP by `comments`.`post_id` ORDER BY comments.date DESC LIMIT 0,".LIMITCOMM); Попробуйте так. Порядок с блоке стал не правильным. Вверху появились старые ссылки, чуть ниже свежее. Логика выборки не понятна. Запрос выполняется очень долго. Изменено 22 февраля 2010 пользователем Medik Цитата Ссылка на сообщение Поделиться на других сайтах
kang 42 Опубликовано: 22 февраля 2010 Рассказать Опубликовано: 22 февраля 2010 как я написал, не работает? Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 22 февраля 2010 Рассказать Опубликовано: 22 февраля 2010 Автор как я написал, не работает? Сайт зависает. Цитата Ссылка на сообщение Поделиться на других сайтах
IT-Security 33 Опубликовано: 23 февраля 2010 Рассказать Опубликовано: 23 февраля 2010 А сколько у Вас извиняюсь вообще записей? Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 23 февраля 2010 Рассказать Опубликовано: 23 февраля 2010 GROUP by недостаточно. Там ещё MAX надо использовать, возможно сортировку. При большом количестве комментариев сайт точно так же повиснет. По уму - надо делать в таблице новости дополнительную колонку с номером последнего комментария. Это дольше, но верно 100%. Цитата Ссылка на сообщение Поделиться на других сайтах
Medik 6 Опубликовано: 26 февраля 2010 Рассказать Опубликовано: 26 февраля 2010 Автор А сколько у Вас извиняюсь вообще записей? Сейчас 44700 GROUP by недостаточно. Там ещё MAX надо использовать, возможно сортировку. При большом количестве комментариев сайт точно так же повиснет. По уму - надо делать в таблице новости дополнительную колонку с номером последнего комментария. Это дольше, но верно 100%. Я к сожалению не умею писать запросы, и в PHP не силен. Но логика думаю нужна такая: выбрать 20 посл. комментариев. Отсортировать по новостям, удалить старые дубликаты, если осталось менее 10 строк, то выбрать ещё 10, отсортировать, удалить дубликаты, слить с 1 запросом, отсортировать, если 10 строк уже есть, то результат достигнут в 2 запроса. Потом можно положить в кеш на 1 минуту, что бы не мучать базу. Цитата Ссылка на сообщение Поделиться на других сайтах
Al-x 7 Опубликовано: 26 февраля 2010 Рассказать Опубликовано: 26 февраля 2010 что бы не мучать базу по-моему, жёче способа, чем вышеизложеный - придумать нельзя))) То, что вы предлагаете можно делать запросом с помощью distinct. Как вы уже пробовали - база ложиться. (на уровне мускула это делается конечно же не по вашему алгоритму, но суть та же, т.к. там выборка ограничена по размеру) Кэш в одну минуту - тоже не серьёзно. Нужно, чтобы он обновлялся только когда добавлен комментарий. Чтобы её не мучать - её нужно модифицировать так, как я написал. Хотя делать конечно же вам. Цитата Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Присоединяйтесь к обсуждению
Вы можете опубликовать сообщение сейчас, а зарегистрироваться позже. Если у вас есть аккаунт, войдите в него для написания от своего имени.