Запрос с лимитом и join - вывести 10 категорий, узнать сколько их всего

Тема в разделе "Базы данных", создана пользователем Горбушка, 19 июн 2014.

Модераторы: latteo
  1. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Всем привет. Кажись, мой мозг начал разжизжаться и я превращаюсь в тупую блондинку.

    Имеем список категорий, имеем список новостей. Требуется вывести 10 категорий, узнать сколько их всего (для создания навигации) и вывести все новости в каждой из категорий. Категорий много, новостей в каждой - 1-10, не больше.

    Ккк это сделать м наименьшей нагрузкой на сервер?
     
  2. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Идиотизм!!!!
    Требуется вывести 10 категорий, узнать сколько их всего и >>>>вывести все новости в каждой из категорий<<<<.

    Ты правда думаешь, что программист, написавший свою CMS, решающий 90% проблем с DataLife Engine, проработавший саппортом около 5 лет не знает, что в SQL есть LIMIT???? Я тебе больше скажу, ты и 1/3 проблемы не решил этим запросом. Как минимум это делается через COUNT(*), а лучше через SQL_CALC_FOUND_ROWS()... Но никак не "SELECT name_cat FROM table1 LIMIT 10". И даже SQL_CALC_FOUND_ROWS не решает проблему вывода всех новостей...
     
    Последнее редактирование модератором: 6 авг 2014
  3. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Я думаю это одним запросом не решить (вернется же плоская таблица, а здесь данные разные). Или же решить, но при этом подключить уже логику приложения.

    Я бы попробовал так и категории уже "слепил и подсчитал" на стороне клиента:

    Код:
    SELECT
      `t1`.`id`,
      `t1`.`catid`,
      `t1`.`title`,
      COUNT(*) AS `counter`
    FROM `news` `t1` JOIN `news` `t2` ON `t1`.`catid` = `t2`.`catid` AND `t1`.`id` >= `t2`.`id`
    GROUP BY `t1`.`catid`, `t1`.`id`
    HAVING `counter` <= 10
    ORDER BY `t1`.`catid`, `t1`.`id`;
    Так ты выведешь не более 10 новостей, но из каждой категории, в которой они есть, не потеряв ни одной. А на стороне клиента перебрать записи и просуммировать уникальные категории. Сюда же можно приджойнить таблицу категорий.

    Если тебе нужны все категории, включая пустые - то лучше просто селектнуть всю таблицу категорий.
     
  4. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    Сделал давно 1 запросом через дублирование полей...
     
  5. BaBL

    BaBL Постоялец

    Регистр.:
    13 ноя 2012
    Сообщения:
    144
    Симпатии:
    87
    Приложи тогда получившийся запрос, может еще кому-то пригодится. Задачка довольно традиционная.
     
  6. Горбушка

    Горбушка Ищу её...

    Регистр.:
    2 май 2008
    Сообщения:
    3.034
    Симпатии:
    2.035
    А что прикладывать? Я в 1 таблицу запихнул копию данных другой и всё... Правда дикий перерасход места...
     
  7. Julembo

    Julembo Писатель

    Регистр.:
    13 окт 2014
    Сообщения:
    3
    Симпатии:
    0
    Нужно просто использовать NESTED SETS для хранения иерархии тогда будет все быстро работать.