ФорумРазработкаБазы данных → Вывод определенного количества строк. Не совсем Limit.

Вывод определенного количества строк. Не совсем Limit.

  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 18 июня 2010 г. 14:30

    Есть таблица, в ней информация о 100 статьях.
    статьи принадлежат разным категориям что определяет поле "categoryID"
    Вопрос:
    Как 1 запросом выбрать по 10 статей из каждой категории. тобиш результат такой получиться должен:

    [0]=>
    [0]=>первая статья
    ….
    [10]=>десятая статья
    [1]=>
    [0]=>первая статья
    ….
    [10]=>десятая статья
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 14:34, спустя 4 минуты 19 секунд

    UNION? :p


    СУБД - не мой конек.
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 18 июня 2010 г. 14:36, спустя 1 минуту 53 секунды

    Не UNION не подходит, так как количество категорий может меняться.
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 14:49, спустя 12 минут 45 секунд

    подождем спецов, че они скажут
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 18 июня 2010 г. 14:53, спустя 4 минуты 50 секунд

    Ну пока я все статьи вытаскиваю, и при выводе учитываю только нужное количество.
    Может и нельзя так как я захотел сделать.
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 14:58, спустя 5 минут 5 секунд

    пока ждем спецов, перескажу занятную историю:

    Ужаснитесь. в оракле нет команды LIMIT. и вот как доктрина его эмулирует:
    с лимитом было бы так:
    SELECT *
    FROM page p
    LEFT JOIN page_translation p2
    ON p.id = p2.id
    WHERE (p.lvl <> '0')
    ORDER BY p.updated_at DESC
    LIMIT 20

    без лимита:
    SELECT *
    FROM page p
    LEFT JOIN page_translation p2
    ON p.id = p2.id
    WHERE p.id IN
    (SELECT a.id
    FROM
    ( SELECT DISTINCT p3.id,
    p3.updated_at
    FROM page p3
    LEFT JOIN page_translation p4
    ON p3.id = p4.id
    WHERE p3.lvl <> '0'
    ORDER BY p3.updated_at DESC
    ) a
    WHERE ROWNUM <= 20
    )
    AND (p.lvl <> '0')
    ORDER BY p.updated_at DESC
    Спустя 13 сек.
    что б не было скучно ждать)
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 18 июня 2010 г. 15:03, спустя 4 минуты 52 секунды

    Ага, я проходил это с ораклом. В MS-SQL те же яйца.
    Если ORDER BY не нужен можно двойным вложенным запросом обойтись, кстати …

    Впрочем, в мускуле не многим лучше, ибо чем дальше лимит тем круче тормозит. Крупные корпорации подстраховались от этого … гыыыыыыыыы
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 15:10, спустя 6 минут 41 секунду

    Крупные корпорации подстраховались от этого

    то есть типа я не я и корова не моя? (лимит официально не поддерживается, ебитесь сами. Медленно работает? вы плохо сэмулировали его)
  • AlexB

    Сообщения: 4290 Репутация: N Группа: в ухо

    Spritz 18 июня 2010 г. 15:23, спустя 13 минут

    Ну типа того … ))))))))))))0
    вот sphinx постранично бьет без тормозов при любом смещениии
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 15:45, спустя 21 минуту 35 секунд

    короче можно типа
    с - категория n - статьи
    только вот лимит не поддерживается в подзапросе, поэтому надо возвращеть эти иды либо представление либо процедурой, передавая туда c.id
    select
    c.*,
    n.id as node_id
    from
    cats c
    left join
    nodes n on (
    (c.id = n.cat_id) AND
    ( n.id in (
    Select n1.id from nodes where n1.cat_id = c.id limit 3
    )
    )
    )
    order by c.id

  • Nyaah

    Сообщения: 574 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 16:04, спустя 19 минут 40 секунд

    а ещё для статей можно ввести ордеринг (разный для каждой категории), постоянно поддерживать его в нормальном состоянии, чтоб не фрагментировались данные, и сортировать по нему, тогда, ели ордеринг начинается с 0 запрос будет простой, SELECT * FROM articles WHERE ordering<10, например, а дальше просто рассувать по статьям и всё
    Work, buy, consume, die
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 16:20, спустя 15 минут 20 секунд

    Naaayh, как вариант…
    Спустя 78 сек.
    а может еще можно что типа, применяя count, group by, having,
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 18 июня 2010 г. 16:32, спустя 11 минут 58 секунд

    Naaayh, наименее ресурсоемкий вариант
    или union
  • Professor

    Сообщения: 2089 Репутация: N Группа: Адекваты

    Spritz 18 июня 2010 г. 16:39, спустя 6 минут 58 секунд

    kostyl, ща буду пробовать твой запрос.
    Интересно что эффективней, твой вложенный запрос или вытаскивать все статьи если их до 1000
  • kostyl

    Сообщения: 5203 Репутация: N Группа: Джедаи

    Spritz 18 июня 2010 г. 16:55, спустя 16 минут 30 секунд

    или union

    как?

Пожалуйста, авторизуйтесь, чтобы написать комментарий!