【问题标题】:Help with limiting a joined mysql database query帮助限制连接的 mysql 数据库查询
【发布时间】:2011-07-06 13:27:51
【问题描述】:

我编写了一个查询,它使用 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 来自文章作为 左外连接articles_categories AS ac ON a.id=ac.article_id LEFT OUTER JOIN categories AS c ON c.id=ac.category_id 左外连接articles_people AS ap ON a.id=ap.article_id LEFT OUTER JOIN people AS p ON p.id=ap.person_id 左外连接articles_organizations AS ao ON a.id=ao.article_id LEFT OUTER JOIN 组织 AS o ON o.id=ao.organization_id ORDER BY date_added

但是!

我在试图弄清楚如何将文章限制为特定数量的 ID 以使用分页时遇到了困难。

理想情况下,我尝试使用尽可能简单明了的 SQL 语句,因为我正在使用带有活动记录类的 codeigniter 框架。 http://codeigniter.com/user_guide/database/active_record.html

非常感谢一些帮助,因为我不想恢复为此使用多个查询,因为我已尝试将其减少为单个查询以提高数据库效率。

四处搜索并尝试了一些替代方案,但似乎没有任何效果。非常感谢!

比如我返回的结果是这样的

-------------------------------------------------- ------------------ id title category_id person_id organization_id -------------------------------------------------- ------------------ 1 次测试 1 1 1 1 次测试 2 1 1 1 次测试 1 2 1 1 次测试 1 1 2 1 次测试 5 1 1 1 次测试 8 1 1 1 次测试 1 4 1 1 次测试 1 4 2 1 次测试 1 1 1 2 测试 2 2 1 1 2 测试 2 1 2 1 2 测试 2 1 1 2 2 测试 2 5 1 1 2 测试 2 8 1 1 2 测试 2 1 4 1 2 测试 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 次测试 1 1 1

而不是

-------------------------------------------------- ------------------ id title category_id person_id organization_id -------------------------------------------------- ------------------ 1 次测试 1 1 1 1 次测试 2 1 1 1 次测试 1 2 1 1 次测试 1 1 2 1 次测试 5 1 1 1 次测试 8 1 1 1 次测试 1 4 1 1 次测试 1 4 2 1 次测试 1 1 1

这是我想要的结果。

【问题讨论】:

    标签: php mysql database codeigniter


    【解决方案1】:

    好的,所以最后我想出了这是怎么可能的。

    我想我会把它包括在这里以防其他人有同样的问题。

    改变这一行

    
    FROM articles AS a
    

    到这里

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

    做我想做的。

    【讨论】:

    • 很高兴你最终弄明白了。您最初的问题绝不暗示这是您所追求的结果。
    • 对于Treffynnon 最初的表述不够清楚,我深表歉意,并感谢您为回复所做的努力。我仍在学习,但将来会尝试更准确地解决我的问题。 :-)
    【解决方案2】:

    那么,为什么不在 SQL 查询中使用 OFFSET 0,10LIMIT *number_of_results* 呢? (如果我理解了这个问题)

    【讨论】:

    • 感谢 Runeroniek,我刚刚更新了我的问题以使其更清楚。希望这能解释为什么单独使用 LIMIT 不会返回我想要的结果?
    【解决方案3】:

    ID的具体数量... WHERE ID IN (2,4,6,8)... ?

    你在使用codeigniter的分页吗? http://codeigniter.com/user_guide/libraries/pagination.html

    【讨论】:

    • 您好我已经更新了我的问题以更好地说明这一点。我可以使用 WHERE 来查找单个文章的详细信息,但我希望能够使用您链接到的 codeigniter 分页进行分页,我认为这需要限制和偏移,或等效于功能。感谢您的帮助!
    • 您好,您可以使用少量选择而不是多次连接,或者如果您想使用查询尝试子查询:WHERE a.id IN (SELECT id FROM article LIMIT 5)
    【解决方案4】:

    您可以使用 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>
    

    在您的情况下,&lt;offset&gt; 将是当前页面 * 一页上的记录数。 &lt;limit&gt; 是您希望每页显示的记录数。

    【讨论】:

    • 嗨,我已经更新了我的问题,使其更加清晰。我试图不仅通过精确的记录数来限制文章,而且还通过 id 的数量乘以每个 id 的结果数量来限制文章。希望这更有意义?
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多