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); Ссылка на сообщение Поделиться на других сайтах
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); Попробуйте так. Ссылка на сообщение Поделиться на других сайтах
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); Попробуйте так. Порядок с блоке стал не правильным. Вверху появились старые ссылки, чуть ниже свежее. Логика выборки не понятна. Запрос выполняется очень долго. Ссылка на сообщение Поделиться на других сайтах
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. Как вы уже пробовали - база ложиться. (на уровне мускула это делается конечно же не по вашему алгоритму, но суть та же, т.к. там выборка ограничена по размеру) Кэш в одну минуту - тоже не серьёзно. Нужно, чтобы он обновлялся только когда добавлен комментарий. Чтобы её не мучать - её нужно модифицировать так, как я написал. Хотя делать конечно же вам. Ссылка на сообщение Поделиться на других сайтах
Рекомендованные сообщения
Архивировано
Эта тема находится в архиве и закрыта для публикации сообщений.