Помогите с ограничением объединенных запросов к базе данных mysql - PullRequest
0 голосов
/ 01 марта 2011

Я написал запрос, который возвращает все записи с несколькими объединениями «многие ко многим» правильно для всего набора или отдельной статьи, используя WHERE a.id =?

SELECT a.id, date_added, title, content, category_id, person_id, organization_id, c.name AS category_name, firstname, lastname, o.name AS organization_name

FROM articles AS a

LEFT OUTER JOIN articles_categories AS ac ON a.id=ac.article_id
LEFT OUTER JOIN categories AS c ON c.id=ac.category_id

LEFT OUTER JOIN articles_people AS ap ON a.id=ap.article_id
LEFT OUTER JOIN people AS p ON p.id=ap.person_id

LEFT OUTER JOIN articles_organizations AS ao ON a.id=ao.article_id
LEFT OUTER JOIN organizations AS o ON o.id=ao.organization_id

ORDER BY date_added

НО!

Я столкнулся с кирпичной стеной, пытаясь решить, как ограничить статьи определенным количеством идентификаторов для работы с нумерацией страниц.

В идеале я пытаюсь использовать как можно более простые и понятные операторы SQL, потому что я использую инфраструктуру codeigniter с их классом активных записей. http://codeigniter.com/user_guide/database/active_record.html

Буду очень признателен за некоторую помощь, поскольку я не хочу возвращаться к использованию нескольких запросов для этого, поскольку я попытался свести ее к одному запросу для повышения эффективности базы данных.

Ищите вокруг и пробовали некоторые альтернативы, но, похоже, ничего не работает. Большое спасибо!

Например, результаты, которые я возвращаю, выглядят так:

---------------------------------------------------------------------
id     title        category_id       person_id       organization_id
---------------------------------------------------------------------
1      test              1                1                  1
1      test              2                1                  1
1      test              1                2                  1
1      test              1                1                  2
1      test              5                1                  1
1      test              8                1                  1
1      test              1                4                  1
1      test              1                4                  2
1      test              1                1                  1
2      test 2            2                1                  1
2      test 2            1                2                  1
2      test 2            1                1                  2
2      test 2            5                1                  1
2      test 2            8                1                  1
2      test 2            1                4                  1
2      test 2            1                4                  2

Мне нужны такие результаты, чтобы я мог создавать под-массивы в php следующим образом:


$articles = $query->result_array();

$output = array();

foreach ($articles as $article) {

    // set up article details   
    $article_id = $article['id'];

    // add article details
    $output[$article_id]['article_id'] = $article_id;
    $output[$article_id]['date_added'] = $article['date_added'];
    $output[$article_id]['title'] = $article['title'];
    $output[$article_id]['content'] = $article['content'];

    // set up people details and add people array with details if exists
    if (isset($article['person_id'])) {
        $person_id = $article['person_id'];

        $output[$article_id]['people'][$person_id]['person_id'] = $person_id;
        $output[$article_id]['people'][$person_id]['lastname'] = $article['lastname'];
        $output[$article_id]['people'][$person_id]['firstname'] = $article['firstname'];
    }

    // set up organizations details and add organizations array with details if exists
    if (isset($article['organization_id'])) {
        $organization_id = $article['organization_id'];

        $output[$article_id]['organizations'][$organization_id]['organization_id'] = $organization_id;
        $output[$article_id]['organizations'][$organization_id]['organization_name'] = $article['organization_name'];               
    }

    // set up categories details and add categories array with details if exists
    if (isset($article['category_id'])) {
        $category_id = $article['category_id'];

        $output[$article_id]['categories'][$category_id]['category_id'] = $category_id;
        $output[$article_id]['categories'][$category_id]['category_name'] = $article['category_name'];
    }       

}

Но если я просто использую LIMIT (со смещением и т. Д.) 1

результаты, которые я получаю

---------------------------------------------------------------------
id     title        category_id       person_id       organization_id
---------------------------------------------------------------------
1      test              1                1                  1

вместо

---------------------------------------------------------------------
id     title        category_id       person_id       organization_id
---------------------------------------------------------------------
1      test              1                1                  1
1      test              2                1                  1
1      test              1                2                  1
1      test              1                1                  2
1      test              5                1                  1
1      test              8                1                  1
1      test              1                4                  1
1      test              1                4                  2
1      test              1                1                  1

что является моим желаемым результатом.

Ответы [ 4 ]

1 голос
/ 01 марта 2011

ОК, наконец-то я понял, как это возможно.

Думаю, я включил бы его сюда на случай, если у кого-то еще возникнет такая же проблема.

Изменение этой строки


FROM articles AS a

к этому


FROM (SELECT * FROM articles LIMIT 5,3) AS a

делает то, что хотел.

0 голосов
/ 01 марта 2011

Вы можете легко ограничить количество возвращаемых записей, используя предложение MySQL LIMIT.Это может быть достигнуто следующим образом с вашим примером запроса:

SELECT a.id, date_added, title, content, category_id, person_id, organization_id, c.name AS category_name, firstname, lastname, o.name AS organization_name

FROM articles AS a

LEFT OUTER JOIN articles_categories AS ac ON a.id=ac.article_id LEFT OUTER JOIN categories AS c ON c.id=ac.category_id

LEFT OUTER JOIN articles_people AS ap ON a.id=ap.article_id LEFT OUTER JOIN people AS p ON p.id=ap.person_id

LEFT OUTER JOIN articles_organizations AS ao ON a.id=ao.article_id LEFT OUTER JOIN organizations AS o ON o.id=ao.organization_id

ORDER BY date_added
LIMIT 10

Где 10 - количество записей, которые вы хотите отобразить.Предложение MySQL LIMIT позволяет указать предел количества записей и начальное смещение.Вот так:

LIMIT <offset>,<limit>

В вашем случае <offset> будет текущей страницей * количество записей на странице.<limit> будет количеством записей, которые вы хотите отобразить на странице.

0 голосов
/ 01 марта 2011

Конкретное количество идентификаторов ... ГДЕ ИДЕНТИФИКАЦИЯ (2,4,6,8) ...?

Вы используете нумерацию кодигнитера? http://codeigniter.com/user_guide/libraries/pagination.html

0 голосов
/ 01 марта 2011

Итак, почему бы вам не использовать OFFSET 0,10 и LIMIT * number_of_results * в запросе SQL? (если я понял вопрос)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...